簡體   English   中英

如何在Django DetailView中訂購嵌套模型

[英]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 %}

請注意,還有一個dictsortreversedDocs )過濾器,可以按相反的順序對對象進行排序。

型號功能

另一種實現方法是在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 %}

設置元類

第三個選項是在模型上設置默認順序。 如果您始終希望通過votesChoice您的Choice ,那么這可能是個好主意。

為此,您可以通過在模型中設置Meta類,並將ordering屬性設置為您要ordering的字段( Docs )。

因此,您將實現以下方式:

class Choice(models.Model):
    #...
    class Meta:
        ordering = ['votes']

////

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM