关于Django教程官方第3部分的问题

2024-04-26 11:42:56 发布

您现在位置:Python中文网/ 问答频道 /正文

在学习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 }}时它也能工作 所以,我想知道为什么这两个可以有相同的输出。你知道吗


Tags: 对象代码textpyselfidreturn官方
1条回答
网友
1楼 · 发布于 2024-04-26 11:42:56

因为您为对象定义了__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,最好显式地执行此操作。你知道吗

相关问题 更多 >