Django - как сделать так, чтобы только автор просматривал свои личные сообщения

В моем приложении 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 имеет богатую стандартную библиотеку, включая модули для работы с текстом, файлами и сетями.


73
2

Ответы:

Вы можете использовать или оператора. что-то вроде этого.

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] напрямую. Для получения дополнительной информации вы можете увидеть со ссылкой на раздел «Модель пользователя» документации.