在我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和我学习。所有的建议是值得欢迎的。
这可能只是个人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 %}