Как запустить функцию для каждого сообщения в моем представлении списка и передать логическую переменную в мой html? - PullRequest
1 голос
/ 13 марта 2020

My html

{% if post.is_liked %}
    <i class="fa fa-check" aria-hidden="true"></i>
{% else %}
    <i class="fa fa-times" aria-hidden="true"></i>
{% endif %}

My views.py

class PostListView(ListView):
    queryset = Post.objects.filter(created__range=['2020-03-01', '2020-03-31'])
    template_name = 'main/problems.html'
    context_object_name = 'posts'
    ordering = ['-created']

    def get_liked(self):
        post = self.get_object()
        user = get_object_or_404(User, username=post.kwargs.get('username'))
        if post.likes.filter(username=user).exists():
            post.annotate(is_liked=True)
        else:
            post.annotate(is_liked=False)

Даже если я установил оба условия, чтобы вернуть true, мой html не будет читать is_liked как true .

1 Ответ

1 голос
/ 13 марта 2020

Ваш for l oop будет просто запускаться при создании класса, и, кроме того, вы просто будете определять функцию (несколько раз), а не выполнять функцию. Наконец, обратите внимание, что это должно изменить атрибут Post, а не только общий объект.

Вы можете аннотировать ваш набор запросов с помощью:

from django.db.models import Exists, OuterRef
from app.models import Post, Like

class PostListView(ListView):
    model = Post
    template_name = 'main/problems.html'
    context_object_name = 'posts'
    ordering = ['-created']
    def get_queryset(self, *args, **kwargs):
        Post.objects.filter(
            created__range=['2020-03-01', '2020-03-31']
        ).annotate(
            is_liked=Exists(Like.objects.filter(
                <b>user_id=self.request.user.pk, post_id=OuterRef('pk')</b>
            ))
        )

user_id и post_id могут иметь разные имена, в зависимости от того, как вы построили модель Like.

Затем в шаблоне вы можете проверить атрибут is_liked ваших Post объектов:

{% for post in posts %}
    {% if <b>post.is_liked</b> %}
        &hellip;
    {% else %}
        &hellip;
    {% endif %}
{% endfor %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...