Django基于类的通用视图示例:** kwargs来自哪里?

时间:2011-10-27 04:57:02

标签: django

在这些例子中,我经常看到** kwargs四处传播,没有提到它来自哪里:

from django.views.generic import DetailView
from books.models import Publisher, Book

class PublisherDetailView(DetailView):

    context_object_name = "publisher"
    model = Publisher

    def get_context_data(self, **kwargs):
        # Call the base implementation first to get a context
        context = super(PublisherDetailView, self).get_context_data(**kwargs)
        # Add in a QuerySet of all the books
        context['book_list'] = Book.objects.all()
        return context

** kwargs从哪里被神奇地摘下来?

另外,为了添加单个字典对象,这看起来不是很多额外的工作吗?

2 个答案:

答案 0 :(得分:5)

kwargs在URLConf中生成。例如,这将填充pk项目:

urlpatterns = patterns('',
    (r'^authors/(?P<pk>\d+)/$', AuthorDetailView.as_view()),
)

通过View.as_view中的view功能,然后通过调用TemplateView.getView.dispatch来进行通话。

答案 1 :(得分:5)

查看SingleObjectMixin的基本实现(“原始”get_context_data)。

它只返回**kwargs作为上下文(字典),同时使用指定的键添加正在编辑的对象。

 def get_context_data(self, **kwargs):
            context = kwargs
            context_object_name = self.get_context_object_name(self.object)
            if context_object_name:
                context[context_object_name] = self.object
            return context

DetailView中,kwargs从任何调用它/传入那些kwargs的东西中“神奇地弹出”。在您的情况下,那将是BaseDetailView.get()

class BaseDetailView(SingleObjectMixin, View):
        def get(self, request, **kwargs):
            self.object = self.get_object()
            context = self.get_context_data(object=self.object)
            return self.render_to_response(context)

它后来被许多视图类(如render_to_response(self.get_context_data))所使用,它将原始context字典传递给self.response_class,默认为django.template.TemplateResponse

TemplateResponse知道如何渲染自身,并在其resolve_context函数中最终将字典转换为django.template.Context

你真的可以从最初的方法一路跟踪源。