как использовать forloop, чтобы оператор if в цикле выполнялся, цикл заканчивается в шаблонах Django - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть 2 модели Django Review и Item, с которыми я работаю.Я хочу посмотреть, просматривал ли пользователь этот элемент.Если да, то он видит обзорную оценку.если нет, он видит кнопку для просмотра элемента

У меня есть следующая модель обзора

class Review (models.Model):
    review_from = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, related_name='review_from')
    review_for = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, related_name='review_for')
    item = models.ForeignKey(OrderItem, related_name='items') 

Определение переменных в контексте представления (псевдокод)

admin = User.objects.get(username="admin")
admins_reviews = Review.objects.filter(review_from__username = "admin")

Ниже мой шаблон

 {% for item in buyers_items %}
    {% for review in buyers_review%}
         {% if review.item.id == item.id %}
              <button class="text-success">Your rating<br/><b>{{review.ratings}}/10</b></button>
         {% else %}
              <a href="{% url ... %}">
                <button>Leave Review</button>
              </a>
          {% endif %}
    {% endfor %}
{% endfor %}

Если я сделаю это, я получу ошибку ниже

enter image description here

Как мне решить эту проблему.

Просмотр

from django import template
register = template.Library()

class OrderHistory(LoginRequiredMixin, ListView):
    model = Order
    template_name = 'order/order_list.html'

    def get_context_data(self, **kwargs):
        context = super(OrderHistory, self).get_context_data()
        context['order_details'] = Order.objects.filter(emailAddress=self.request.user.email)
        context['order_items'] = OrderItem.objects.filter(order__emailAddress=self.request.user.email)
        context['buyers_review'] = Review.objects.filter(review_from=self.request.user)
        print(context['buyers_review'])
        return context

Пользовательский тег

    @register.filter()
    def review_bought_items(order_items, buyers_review):
        return buyers_review.filter(item__in=order_items).exists()

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

Исходя из того, что я вижу в ваших шаблонах, вы можете сделать это проще с помощью фильтра тегов или с вашей стороны.Давайте перейдем к пользовательскому тегу:

@register.filter
def review_bought_items(buyers_items,buyers_review):
     return buyers_review.filter(item__in=buyers_items).exists()

Теперь в шаблонах вы можете сделать

<!-- load the tag -->
{% load file %}

{% if buyers_items|review_bought_items:buyers_review %}
     <button class="text-success">Your rating<br/><b>{{review.ratings}}/10</b></button>
{% else %}
     <a href="{% url ... %}">Leave Review</a>
{% endif %}
0 голосов
/ 26 ноября 2018

Проблема в том, что вы перебираете все buyers_reviews.В данном конкретном случае у вас есть 2 отзыва покупателей, один для текущего элемента, а другой для другого.

Первая итерация оценивает False первое условие и отображает все кнопки Leave Reviewи 2-я итерация оценит его как True и отобразит блок «Ваша оценка».

Если вы не хотите перемещать всю логику на серверной части, возможно, сделайте из шаблона тег по порядкуотфильтровать отзывы на основе item.id

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