Django的 - for循环两个变量在字典中传递

问题描述 投票:1回答:1

在我view.py文件我有两个疑问,每个分配一个变量名。查询1收集所有的这些评价表评论。查询2计算的平均得分从审查表中的每个审查。两个查询,一个表。

我已经放在Query 1(名为reviews)和Query 2(名为ratings)一个名为context要传递给我的html文件的字典里面。

我的目标是显示每个审查,审查的评级。但是我有我的目前的做法正确显示那就麻烦了。这是我的HTML文件:

{% extends "reviews/layout.html" %}
{% block content %}
    {% for review in reviews %}
      {% for rating in ratings %}
        <article class="media content-section">
          <img class="rounded-circle article-img" src="{{ review.author.profile.image.url }}">
          <div class="media-body">
            <div class="article-metadata">
              <h4 class="mr-2">{{ review.company }} {{ rating.rate }}</h4>
              <small class="text-muted">{{ review.date_posted|date:"F d, Y" }}</small>
            </div>
            <h5><a class="article-title" href="{% url 'review-detail' review.id %}">{{ review.title }}</a></h5>
            <p class="article-content">{{ review.content }}</p>
          </div>
        </article>
      {% endfor %}
    {% endfor %}
{% endblock content %}

我有一个for环内的for循环。正如所料,结果为每个审查正显示了一遍又一遍对每个平均水平。例如,我有7条与7个评级。结果看起来像这样:(注意:我放在代码标签的结果,这样他们就可以看到更容易。)

Review 1, rating for review 1
Review 1, rating for review 2
Review 1, rating for review 3
Review 1, rating for review 4
Review 1, rating for review 5
Review 1, rating for review 6
Review 1, rating for review 7

Review 2, rating for review 1
Review 2, rating for review 2
....
Review 2, rating for review 7

相反,我的目标是看到:

Review 1, rating for review 1
Review 2, rating for review 2
Review 3, rating for review 3
Review 4, rating for review 4
...

view.py文件:


def reviews(request):
    reviews = Review.objects.all()

    ratings = Review.objects.filter(id__in=[review.id for review in reviews]).annotate(rate=(F('value1')+F('value2')+F('value3')+F('value4'))/4)

    context = {
        'reviews': reviews,
        'ratings': ratings
    }
    return render(request, 'reviews/reviews.html', context)

我读过使用zip()其他情况下,但我不认为适用于我的情况?

我知道这是一个新秀的挑战,但我是新来的Django和我学习。所有的建议是值得欢迎的。

mysql django dictionary for-loop
1个回答
1
投票

这可能只是个人prefererence但我喜欢相关的上下文场组合。如果我理解你的代码正确你想为一个审查的所有收视率,这可以通过编辑视图来达到的。

def someview(request):
  reviews = Review.objects.all()
  review_list = []
  for review in reviews:
     ratings = Rating.objects.filter(review=review)
     ratings_list = []
     for rating in ratings:
        ratings_list.append({
             'rating_value':rating.value
        })
     review_list.append({
          'id':review.pk
          'ratings':ratings_list,
     })
  context = {'reviews':review_list}

然后在你的HTML比如,你可以这样做:

{% for review in reviews %}
      {% for rating in review.ratings %}
      Review {{review.id}}, rating is {{rating.value}}
      {% endfor %}
{% endfor %}
© www.soinside.com 2019 - 2024. All rights reserved.