如何在 django DetailView 中订购嵌套模型

康山

我正在使用 Django 1.10

我正在通过 make Survey 程序学习 Django

我做了三个模型,调查包括问题,问题包括选择

模型.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)

我想显示按投票排序的结果页面,但现在,我只显示非排序的结果页面。

我想我必须使用查询集或额外的上下文来修改我的 views.py。但是不知道怎么用。

这是我的观点和模板。

视图.py

class SurveyResultsView(DetailView):
    model = Survey
    template_name = 'survey/results.html'

结果.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 %}

设置元类

第三个选项是在您的模型上设置默认排序。如果您总是希望Choice被订购,votes这可能是一个好主意。

您可以通过将Meta模型中ordering设置为您想要排序的字段 ( Docs )属性来完成此操作

所以你实现这个的方式是:

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

////

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Django DetailView动态模型

来自分类Dev

Django DetailView动态模型

来自分类Dev

如何在Django DetailView中使用URL中的值和请求?

来自分类Dev

如何在Django DetailView中使用URL中的值和请求?

来自分类Dev

在Django DetailView中获取表单

来自分类Dev

在Django的detailview中获取方法

来自分类Dev

如何在DetailView中引用pk

来自分类Dev

如何在DetailView中引用pk

来自分类Dev

如何在DetailView中过滤其他模型?

来自分类Dev

如何在Django的DetailView中使用prefetch_related

来自分类Dev

如何在Django的DetailView中使用prefetch_related

来自分类Dev

在Django 1.6中结合DetailView和CreateView

来自分类Dev

Django DetailView中的增量视图计数

来自分类Dev

在Django 1.6中结合DetailView和CreateView

来自分类Dev

在 Django 的 DetailView 中显示其他表单

来自分类Dev

如何订购在Django中动态创建的模型表单字段

来自分类Dev

Django通用视图:在本教程中,DetailView如何自动提供变量?

来自分类Dev

如何将ListView添加到通用DetailView中?Django的

来自分类Dev

如何使用基于类的视图DetailView将图像库放入Django中的product.html

来自分类Dev

如何在 DetailView 中对 ForeignKey 实例进行分页

来自分类Dev

如何在 generic.DetailView 中获取 pk?

来自分类Dev

Django Rest如何在模型方法上订购

来自分类Dev

如何通过单击按钮更新 DetailView 中的模型字段

来自分类Dev

用于两个单独查询/模型的 Django DetailView

来自分类Dev

django通用DetailView

来自分类Dev

在DetailView中分页[Django]

来自分类Dev

Django DetailView发生错误?

来自分类Dev

如何仅在detailview(Django)的ManytoManyfield上设置order_by?

来自分类Dev

DetailView重定向在Django中不起作用

Related 相关文章

热门标签

归档