2011-10-27 14 views
7

W przykładach I stale zobaczyć ** kwargs przeszły dookoła bez wzmianki o których pochodzi:Przykładowy przykład oparty na klasach Django: skąd się bierze ** 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 

Gdzie jest ** kwargs jest magicznie wyrwane z?

Co więcej, czy nie wydaje się to dużo dodatkowej pracy tylko po to, aby dodać pojedynczy obiekt słownika?

+0

Prawdopodobny duplikat: http://stackoverflow.com/q/1769403/576139 –

+2

Mówię o tym konkretnym przypadku. Wiem, co oznacza ** kwargs. –

Odpowiedz

5

Spójrz na podstawową implementację SingleObjectMixin ("oryginał" get_context_data).

Po prostu zwraca **kwargs jako kontekst (słownik), jednocześnie dodając edytowany obiekt za pomocą określonego klucza.

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 

W DetailView, że kwargs są „magicznie wyrwane” z cokolwiek nazywając go/mijania w tych kwargs. W twoim przypadku byłby to 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) 

To później wykorzystywane przez wielu klas widzenia (jak w render_to_response(self.get_context_data)), który przechodzi surową context słownika self.response_class który jest domyślnie django.template.TemplateResponse.

TemplateResponse wie, jak uczynić siebie, aw jego resolve_context funkcji, w końcu zamienia słownika do django.template.Context

Naprawdę mogą śledzić source całą drogę od oryginalnej metodzie całą drogę w dół.

5

Kwargs są generowane w URLConf. Na przykład ten będzie wypełnić pozycję pk:

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

Połączenie odbywa się za pomocą funkcji w View.as_view a następnie przez View.dispatch który wzywa TemplateView.getview.

Powiązane problemy