В моем приложении django я хочу, чтобы пользователь мог выбирать, является ли сообщение общедоступным или частным.
Это моя лучшая попытка на данный момент:
view.py
def home(request):
recipes = models.Recipe.objects.filter(recipe_private, recipes)
context = {
'recipes': recipes
}
def recipe_private():
for recipe in recipes:
if recipe(is_private=True) and recipe.author == self.request.user:
True
else:
False
return render(request, "recipes/home.html", context)
А вот мой models.py:
class Recipe(models.Model):
title = models.CharField(max_length=100)
description = models.TextField()
author = models.ForeignKey(User, on_delete=models.CASCADE)
serving = models.PositiveIntegerField(default=1)
temperature = models.PositiveIntegerField(default=1)
prep_time = models.PositiveIntegerField(default=1)
cook_time = models.PositiveIntegerField(default=1)
##tags = models.ManyToManyField('Tag')
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
id = models.CharField(max_length=100, default=uuid.uuid4, unique=True, primary_key=True, editable=False)
is_private = models.BooleanField(default=True)
def get_absolute_url(self):
return reverse('recipes-detail', kwargs = {"pk": self.pk})
def __str__(self):
return str(self.title)
Логика работает у меня в голове, но не на практике. Как бы мне это улучшить? Я хочу, чтобы только автор мог видеть свои личные сообщения, а любой, кто не является автором, не мог видеть сообщение, помеченное как личное.
🤔 А знаете ли вы, что...
Python имеет богатую стандартную библиотеку, включая модули для работы с текстом, файлами и сетями.
Вы можете использовать или оператора. что-то вроде этого.
recipes = models.Recipe.objects.filter(recipe.author == self.request.user) or models.Recipe.objects.filter(is_private=False)
recipe.author == self.request.user
будет фильтровать пользователя
собственный рецептis_private=False
будет фильтровать все рецепты, объявленные общедоступными.Вы фильтруете с помощью:
from django.db.models import Q
def home(request):
recipes = models.Recipe.objects.filter(
Q(author=request.user) | Q(is_private=False)
)
context = {'recipes': recipes}
return render(request, 'recipes/home.html', context)
Примечание. Обычно лучше использовать settings.AUTH_USER_MODEL [Django-doc] для ссылки на модель пользователя, чем использовать модель пользователя [Django-doc] напрямую. Для получения дополнительной информации вы можете увидеть со ссылкой на раздел «Модель пользователя» документации.