关于 Django 教程官方 part3 html 代码的问题



当我在学习 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,最好明确执行此操作

最新更新