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 есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
73
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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 будет фильтровать все рецепты, объявленные общедоступными.

Это совершенно неправильно. Либо вы хотели объединить два набора запросов (тогда это |, а не or), либо объединить два условия (как в другом ответе), но or не будет делать то, что вы ожидаете. Если у пользователя есть хотя бы один рецепт, будут возвращены только принадлежащие ему рецепты, не включая общедоступные рецепты, созданные другими.

STerliakov 04.08.2024 01:39
Ответ принят как подходящий

Вы фильтруете с помощью:

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

Я использую auth_user_model, поэтому мне следует изменить его на request.auth.user. ?

C0untV 04.08.2024 03:03

Другие вопросы по теме

Похожие вопросы