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 the User model [Django-doc] directly. For more information you can see the referencing the User model section of the documentation.

Вернуться на верх