【问题标题】:Why must context be retrieved via the get_context_data method of the generic class DetailView?为什么必须通过泛型 DetailView 的 get_context_data 方法检索上下文?
【发布时间】:2019-12-05 13:25:58
【问题描述】:

我有一个简单的问题,我会解释一下。我正在使用 djangoproject.com 上的文档阅读通用视图,在此页面上,它们显示了以下示例:

from django.utils import timezone
from django.views.generic.detail import DetailView

from articles.models import Article

class ArticleDetailView(DetailView):

    model = Article

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['now'] = timezone.now()
        return context

我的问题是:当ArticleDetailView 已经从DetailView 继承时,为什么需要通过从super() 调用get_context_data 方法来初始化context? 你不能通过子类的get_context_data 访问上下文吗?喜欢self.get_context_data(**kwargs)?

我很困惑!

编辑:这里是文档https://docs.djangoproject.com/en/2.2/ref/class-based-views/generic-display/的链接

【问题讨论】:

    标签: django django-class-based-views


    【解决方案1】:

    我的问题是:当ArticleDetailView 已经从DetailView 继承时,为什么需要通过从super() 调用get_context_data 方法来初始化上下文?你不能通过子类的get_context_data 访问上下文吗?喜欢self.get_context_data(**kwargs)?

    如果您调用self.get_context_data(),您将调用ArticleDetailView 的get_context_data(..) 方法,并因此调用相同的方法。因此,这意味着您会陷入无限递归,直到最终调用堆栈耗尽并获得RecursionError。

    您本身不需要检索super() 代理对象的上下文,例如,如果您想“从头开始”构造一个上下文字典。但是DetailView 通常已经将大量数据注入到视图中。例如,它将向字典中添加一个项目object,该项目引用您要显示数据的对象,而view 则引用当时正在处理的视图实例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多