在学习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 }}
时,它可以工作
所以,我想知道为什么这两个可以有相同的输出。
答案 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
,最好明确进行。