有关Django教程官方第3部分HTML代码的问题

时间:2018-09-17 11:05:03

标签: python django

在学习Django官方教程第3部分时,我对js代码有疑问。在“引发404错误”部分中,正式代码使用以下代码在名为“问题”的对象中显示“ question_text”:

{{ question }}

我不明白为什么这段代码可以工作。 “问题”不是字符串而是对象。它应该是“ question.question_text”。

views.py

def detail(request, question_id):
    try:
        question = Question.objects.get(pk=question_id)
    except Question.DoesNotExist:
        raise Http404("Question does not exist")
    return render(request, 'polls/detail.html', {'question': question})

models.py

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

    def __str__(self):
        return self.question_text

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

此外,当我使用代码{{ question.question_text }}时,它可以工作 所以,我想知道为什么这两个可以有相同的输出。

1 个答案:

答案 0 :(得分:1)

因为您为对象定义了__str__

class Question(models.Model):

    # ...

    def __str__(self):
        return self.question_text

Django对变量隐式调用str(..)。如果您没有覆盖__str__,它将仍然呈现某些内容:超类的__str__。对于非模型对象(例如int,列表,元组,自定义类对象等),也会发生同样的情况。

由于默认情况下,模型的__str__看起来类似于Model object (id),因此,如果您不覆盖__str__(两者之间也没有超类),则它将渲染对象那样。因此,如果您自己不提供__str__,它将看起来像Question object (123)(带有123对象的id)。

请注意,您通过编写{{ question }}取决于__str__函数:如果以后更改__str__,则呈现方式将发生变化。因此,如果您需要question_text,最好明确进行。