2011-10-27 45 views
7

在这些例子中,我经常看到**没有提到它是从哪里传来传来传kwargs: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被奇迹般地从弹拨?

另外,这似乎不像一个额外的工作只是添加一个单一的字典对象吗?

+0

可能的重复:http://stackoverflow.com/q/1769403/576139 –

+2

我在说这个特定的实例。我知道** kwargs的含义。 –

回答

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) 

它以后,通过该传递原始context字典self.response_class其是由默认django.template.TemplateResponse许多视图类(如在render_to_response(self.get_context_data))使用。

TemplateResponse知道如何来表现自己,并在其resolve_context功能,终于字典转换为django.template.Context

你真的可以按照源从原来的方法,一路一路下跌。

5

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

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

电话是通过在View.as_view然后通过View.dispatch这就要求TemplateView.getview功能。