[英]How to set order_by only on ManytoManyfield in detailview (Django)?
[英]How to order nested model in django DetailView
我正在使用Django 1.10
我正在通過Make Survey程序學習Django
我制作了三個模型,“調查包括問題”和“問題包括選擇”
Models.py
from django.db import models
class Survey(models.Model):
title = models.CharField(max_length = 200)
description = models.TextField()
pub_date = models.DateTimeField('date published')
def __str__(self):
return self.title
class Question(models.Model):
survey = models.ForeignKey(Survey, on_delete=models.CASCADE)
question_text = models.CharField(max_length=200)
def __str__(self):
return "%s : %s" % (self.survey, self.question_text)
class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
def __str__(self):
return "%s - %s" % (self.question, self.choice_text)
我想按投票顯示我的結果頁,但現在,我只顯示未排序的結果頁。
我想我必須使用queryset或其他上下文來修改views.py。 但我不知道該怎么用
這是我的觀點和模板。
views.py
class SurveyResultsView(DetailView):
model = Survey
template_name = 'survey/results.html'
results.html
{% extends 'survey/base.html' %}
{% block content %}
<div class="survey-info-container">
<h1>Results of {{survey.title}}</h1>
<p>{{survey.description}}</p>
<p>{{survey.pub_date}}</p>
</div>
<div class="result-container">
{% for question in survey.question_set.all %}
<p>
<h3>{{question.question_text}}</h3>
<ul>
{% for choice in question.choice_set.all %}
<li>{{choice.choice_text}} -- {{choice.votes}} votes </li>
{% endfor %}
</ul>
</p>
{% endfor %}
</div>
{% endblock content %}
感謝您的閱讀。
我可以提出三種不同的方法來實現這一目標。
第一個,最明顯的一個是,當您在模板中獲取choice
對象時,對它們進行排序。 您可以使用像我在下面顯示的那樣應用的dictsort
過濾器( Docs )來執行此操作。
{% for choice in question.choice_set.all|dictsort:"votes" %}
<li>{{choice.choice_text}} -- {{choice.votes}} votes </li>
{% endfor %}
請注意,還有一個dictsortreversed
( Docs )過濾器,可以按相反的順序對對象進行排序。
另一種實現方法是在Question
模型上定義一個函數,該函數以所需的排序順序返回條目,然后代替調用模板中的question.choice_set.all()
。
例:
class Question(models.Model):
#...
def choice_set_sorted(self):
# Can set .order_by('-votes') to reverse order
return self.choice_set.all().order_by('votes')
模板:
{% for choice in question.choice_set_sorted %}
<li>{{choice.choice_text}} -- {{choice.votes}} votes </li>
{% endfor %}
第三個選項是在模型上設置默認順序。 如果您始終希望通過votes
來Choice
您的Choice
,那么這可能是個好主意。
為此,您可以通過在模型中設置Meta
類,並將ordering
屬性設置為您要ordering
的字段( Docs )。
因此,您將實現以下方式:
class Choice(models.Model):
#...
class Meta:
ordering = ['votes']
////
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.