Запрос к M2M из языка шаблонов Django

Возможно, это проблема новичка, но я не могу найти способ ее обойти.

Я пытаюсь реализовать добавление рецепта в избранное.

Представление и модель работают правильно, так как когда я нажимаю на кнопку один раз, она отправляет запрос и добавляет рецепт в избранное пользователя. Затем при повторном нажатии он корректно удаляет его из базы данных.

Теперь, когда я пытаюсь сделать видимым шаблон, у меня возникли проблемы с языком шаблона.

Я не могу найти способ проверить, понравился ли текущему профилю пользователя пагинированный рецепт.

У меня есть следующее представление списка на основе класса

class Home(ListView):
    model = Recipe
    template_name = 'home.html'
    cloudinary_name = settings.CLOUDINARY_STORAGE.get('CLOUD_NAME')
    extra_context = {
        'cloudinary_name': cloudinary_name,
    }
    paginate_by = 2

    def get_queryset(self):
        return Recipe.objects.order_by('id').prefetch_related('profile__recipecomment_set__recipe')

и следующая модель Рецепта

class Recipe(models.Model):
    title = models.CharField(
        max_length=TITLE_MAX_LENGTH,
        validators=(
            MaxLengthValidator(TITLE_MAX_LENGTH),
            MinLengthValidator(TITLE_MIN_LENGTH),
        ),
        null=False,
        blank=False,
    )

    profile = models.ForeignKey(
        Profile,
        on_delete=models.RESTRICT,
        null=False,
        blank=True,
        editable=False,
    )

    favourites = models.ManyToManyField(
        Profile,
        related_name='favourite',
        default=None,
        blank=True,
    )

шаблон.html выглядит следующим образом, вот код, который не работает

{% for recipe in page_obj %}
    {% if request.user.profile.id in recipe.favorites %}
        <button>Recipe added to favourites</button>
    {% else %}
        <button>Add to favourites</button>
    {% endif %}
{% endfor %}

пагинация работает, все остальное работает, за исключением того, что я не могу проверить, добавил ли пользователь каждый рецепт в избранное или нет.

Наконец-то я сам нашел ответ. Возможно, он не самый лучший, но он работает.

В представлении Home я добавил статический метод, который проверяет каждый элемент в контексте object_list и добавляет атрибут, который позже можно использовать внутри шаблона.

    @staticmethod
def is_in_favourites(request, recipe):
    if request.user.is_authenticated:
        return True if recipe.favourites.filter(id=request.user.profile.id).exists() else False
    return False

def get_context_data(self, *, object_list=None, **kwargs):
    ctx = super().get_context_data(object_list=object_list, **kwargs)
    for i in ctx.get('object_list'):
        i.is_in_favourites = self.is_in_favourites(self.request, i)
    return ctx
Вернуться на верх