在学习Django官方教程第3部分时,我有一个关于js代码的问题。在“引发404错误”部分中,官方代码使用以下代码在名为“question”的对象中显示“question\u text”:
{{ question }}
我不明白为什么这个代码可以工作。“问题”不是字符串而是对象。应该是”question.question\u文本" . 你知道吗
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__
:Django隐式地调用变量上的
str(..)
。如果您没有覆盖__str__
,它仍然会呈现一些东西:超类的__str__
。对于非模型对象(如int
、列表、元组、自定义类对象等)也是如此。你知道吗由于模型在默认情况下有一个
__str__
,看起来近似于Model object (id)
,如果您不重写__str__
(或者中间的某个超类),那么它将以这种方式呈现对象。因此,如果您自己不提供__str__
,它看起来就像Question object (123)
(对象的123
就是id
)。你知道吗注意,编写
{{ question }}
依赖于__str__
函数:如果稍后更改__str__
,则呈现将更改。因此,如果您需要question_text
,最好显式地执行此操作。你知道吗相关问题 更多 >
编程相关推荐