Django- как сделать так, чтобы только автор просматривал свои личные сообщения
Для моего приложения django я хочу дать пользователю возможность выбирать, является ли сообщение публичным или приватным.
Это моя лучшая попытка на данный момент:
views.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)
Логика работает в моей голове, но не на практике, как бы я мог улучшить это? Я хочу, чтобы только автор мог видеть свои личные сообщения, любой, кто не является автором, не должен видеть сообщение, помеченное как личное.
Вы можете использовать оператор or. что-то вроде этого.
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)
Note: It is normally better to make use of the
settings.AUTH_USER_MODEL
[Django-doc] to refer to the user model, than to use theUser
model [Django-doc] directly. For more information you can see the referencing theUser
model section of the documentation.