当我在学习 Django 官方教程第 3 部分时,我对 js 代码有疑问。在"引发 404 错误"部分,官方代码使用以下代码在名为"question"的对象中显示"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 }}
所以,我想知道为什么这两者可以有相同的输出。
因为您为对象定义了__str__
:
class Question(models.Model):
# ...
def __str__(self):
return self.question_text
Django 隐式调用变量上的str(..)
。如果你没有覆盖__str__
它仍然会呈现一些东西:超类的__str__
。非模型对象(如int
、列表、元组、自定义类对象等(也会发生同样的情况。
由于默认情况下模型具有一个看起来与Model object (id)
大致相似的__str__
,如果您不覆盖__str__
(也不覆盖两者之间的某些超类(,那么它将以这种方式呈现对象。因此,如果您自己不提供__str__
,它看起来像Question object (123)
(123
对象的id
(。
请注意,您通过编写{{ question }}
依赖于__str__
函数:如果您稍后更改__str__
,渲染将更改。因此,如果您需要question_text
,最好明确执行此操作。