Запрос к 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