Django-如何只显示选择的问题?

时间:2019-02-21 17:31:47

标签: django django-models django-templates django-views

我正在完成官方Django教程。该教程涉及创建一个民意测验应用程序,其中包括创建带有选择项的问题。

当前,索引页面为该问题具有的每个选择显示一个问题实例。例如,如果问题是“您最喜欢吃什么?”并且该问题的选择是“白菜”,“金属”和“我的骄傲”,索引页面显示了三个重复的“您最喜欢吃的东西是什么?”。

我正在尝试更改索引页面以仅显示每个具有选择项的问题的一个实例。我该如何更改已经写的内容?

views.py

class IndexView(generic.ListView):
    template_name = 'polls/index.html'
    context_object_name = 'latest_questions'

    def get_queryset(self):
    """
    Return the last ten published questions. Exclude questions to be
    published in the future and questions that have no choices.
    """
    published_questions_with_choices = Question.objects.filter(
        choice__isnull=False).filter(
        pub_date__lte=timezone.now())

    return published_questions_with_choices.order_by('-pub_date')[:10]

index.html

    {% load static %}

<link rel="stylesheet" type="text/css" href="{% static 'polls/style.css' %}">

{% if latest_questions %}
    <ul>
    {% for question in latest_questions %}
    <li><a href="{% url 'polls:detail' question.id %}">{{ question.question_text }}</a></li>
    {% endfor %}
    </ul>
{% else %}
    <p>No polls are available.</p>
{% endif %}

models.py

class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')

    def __str__(self):
        return self.question_text

    def was_published_recently(self):
        now = timezone.now()
        return now - datetime.timedelta(days=1) <= self.pub_date <= now


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 self.choice_text

已加载的索引屏幕(包括免费的无飞溅图像作为背景):

enter image description here

我怀疑我必须在views.py中更改{% for question in latest_questions %}。但是,我不确定该如何更改。

非常感谢您的任何答复。

1 个答案:

答案 0 :(得分:1)

如果存在多个满足过滤条件的相关对象,则对m2m关系进行过滤将多次返回原始模型。您应该在查询中添加distinct()

published_questions_with_choices = Question.objects.filter(
    choice__isnull=False).filter(
    pub_date__lte=timezone.now()).distinct()

您将在模板中看到该问题仅显示一次。