在这些例子中,我经常看到** 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从哪里被神奇地摘下来?
另外,为了添加单个字典对象,这看起来不是很多额外的工作吗?
答案 0 :(得分:5)
kwargs在URLConf中生成。例如,这将填充pk
项目:
urlpatterns = patterns('',
(r'^authors/(?P<pk>\d+)/$', AuthorDetailView.as_view()),
)
通过View.as_view
中的view
功能,然后通过调用TemplateView.get
的View.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
你真的可以从最初的方法一路跟踪源。