2011-10-27 28 views
7

Trong ví dụ này, tôi liên tục nhìn thấy ** kwargs thông qua xung quanh với không đề cập đến nơi nó đến từ:Ví dụ về chế độ xem chung dựa trên lớp Django: vị trí của ** kwargs đến từ đâu?

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 

đâu kwargs ** bị kỳ diệu gảy từ đâu?

Ngoài ra, điều này không có vẻ giống như một toàn bộ rất nhiều công việc phụ chỉ để thêm một đối tượng từ điển duy nhất?

+0

Có thể trùng lặp: http://stackoverflow.com/q/1769403/576139 –

+2

Tôi đang nói về trường hợp cụ thể này. Tôi biết những gì ** kwargs có nghĩa là. –

Trả lời

5

Nhìn vào triển khai cơ sở của SingleObjectMixin ("ban đầu" get_context_data).

Nó chỉ trả về **kwargs làm ngữ cảnh (từ điển), trong khi thêm đối tượng đang được chỉnh sửa bằng khóa được chỉ định.

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 

Trong một DetailView, các kwargs được "kỳ diệu gảy" từ bất cứ điều gì được gọi đó là/đi qua trong những kwargs. Trong trường hợp của bạn, đó sẽ là 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) 

Nó sau đó được sử dụng bởi nhiều lớp xem (như trong render_to_response(self.get_context_data)) mà vượt qua nguyên context từ điển để self.response_class mà là theo mặc định django.template.TemplateResponse.

TemplateResponse biết làm thế nào để làm cho chính nó, và trong chức năng resolve_context của nó, cuối cùng chuyển đổi từ điển để một django.template.Context

Bạn thực sự có thể làm theo các nguồn tất cả các cách từ phương pháp ban đầu tất cả các con đường xuống.

5

Các kwarg được tạo trong URLConf. Ví dụ này sẽ cư pk mục:

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

Cuộc gọi là thông qua các chức năng trong viewView.as_view và sau đó thông qua View.dispatch trong đó kêu gọi TemplateView.get.

Các vấn đề liên quan