django Нравится, что нелюбовь не работает в списке сообщений. Но она работает над деталями сообщения - PullRequest
0 голосов
/ 13 января 2020

Я не могу использовать функцию «is_liked» в forl oop домашних шаблонов, если не часть. Функция просмотра сообщений "is_liked" работает корректно. Если вошедшему в систему пользователю понравился конкретный пост, на нем появится кнопка неприязни. Но я не могу показать кнопку неприязни в списках сообщений. Я пробовал много способов сделать это, но не могу найти решение.

"если is_liked else" часть не работает дома. html

home. html:

{% for post in posts %}

      <p><a class="article-content" href="{% url 'post-detail' pk=post.pk %}" >{{ post.content }}</a></p>
      <a href="{% url 'post-likes' pk=post.pk %}">
        {{ post.total_likes }}like{{ post.total_likes|pluralize}}
      </a>
      <form action="{% url 'like_post' %}" method="POST">
          {% csrf_token %}
          {% if is_liked %}
            <button type="submit" id="like" name="post_id" value="{{ posts.id }}" class="btn btn-danger">dislike</button>
          {% else %}
          <button type="submit" id="like" name="post_id" value="{{ post.id }}" class="btn btn-primary">like</button>
          {% endif %}

      </form>
      <a href="{% url 'post-detail' pk=post.pk %}">{{ post.comments.count }}comment{{ post.comments.count|pluralize }}</a>

{% endfor %}

post_detail. html:

<p>{{ posts.content }}</p>
<a href="{% url 'post-likes' pk=posts.pk %}">
{{ total_likes }}like{{ total_likes|pluralize }}
</a>
<form action="{% url 'like_post' %}" method="POST">
{% csrf_token %}
{% if is_liked %}
<button type="submit" id="like" name="post_id" value="{{ posts.id }}" class="btn btn- 
  danger">dislike</button>
{% else %}
<button type="submit" id="like" name="post_id" value="{{ posts.id }}" class="btn btn- 
  primary">like</button>
{% endif %}
</form>

views.py:

def post_detail(request, pk):
    posts = get_object_or_404(post, pk=pk)
    is_liked = False
    if posts.likes.filter(id=request.user.id).exists():
        is_liked = True

@login_required
def like_post(request):
    posts = get_object_or_404(Post, id=request.POST.get('post_id'))
    is_liked = False
    if posts.likes.filter(id=request.user.id).exists():
        posts.likes.remove(request.user)
        is_liked = False
    else:
        posts.likes.add(request.user)
        is_liked = True

    context = {'posts': posts, 'is_liked': is_liked, 'total_likes': posts.total_likes(), }


# postlist on views.py:


def post_list(request):
    posts = post.objects.all().order_by('-date_posted')

    return render(request, 'blog/home.html', {'posts': posts, })

Я пробовал значение is_liked в списке сообщений ... но оно выдавало ошибки. Я не могу найти правильный способ сделать это.

Ответы [ 2 ]

0 голосов
/ 15 января 2020

Как указывает J c, аннотации Din являются одним из подходов. Однако, поскольку ваша модель, кажется, содержит m2m field IMHO, нам нужно добавить некоторое агрегирование, чтобы убедиться, что мы получаем только отдельные объекты в нашем результирующем наборе запросов.

Попробуйте следующее

    @login_required
    def post_list(request):
        # annotate `is_liked` field by checking if the current user is in the
        # record that liked the post other

        count_filter = Q(likes=request.user)
        like_case = Count('likes', filter=count_filter, output_field=BooleanField())

        posts = post.objects \
            .annotate(is_liked=like_case) \
            .all().order_by('-date_posted')

        return render(request, 'blog/home.html', {'posts': posts, })

Затем в вашем шаблоне, где написано {% if is_liked %}, измените это на

{% if post.is_liked %}
0 голосов
/ 14 января 2020

вам нужно предоставить is_liked к вашему ответу post_list

from django.contrib.auth.models import User
from django.db.models import BooleanField
from django.db.models import When, Case


def post_list(request):
    # annotate `is_liked` field by checking if the current user is in the
    # record that liked the post other
    like_case = Case(
        When(likes__in=[request.user], then=True),
        default=False, output_field=BooleanField())
    posts = post.objects \
        .annotate(is_liked=like_case) \
        .all().order_by('-date_posted')

    return render(request, 'blog/home.html', {'posts': posts, })

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...