2011-10-27 14 views
7

Negli esempi, ho sempre vedere ** kwargs passati in giro con alcuna menzione di dove è venuta da:Esempio di visualizzazione di una classe generica basata su Django: da dove provengono ** 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 

Dove è kwargs ** essere magicamente pizzicate da?

Inoltre, questo non sembra un sacco di lavoro extra solo per aggiungere un singolo oggetto dizionario?

+0

Eventuali duplicati: http://stackoverflow.com/q/1769403/576139 –

+2

sto parlando di questo caso specifico. So cosa vuol dire kwargs. –

risposta

5

Vedere l'implementazione di base di SingleObjectMixin ("originale" get_context_data).

Esso restituisce semplicemente **kwargs a seconda del contesto (un dizionario), mentre l'aggiunta dell'oggetto in fase di modifica con la chiave specificata.

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 

In un DetailView, i kwargs sono "magicamente spennati" da tutto ciò che è chiamandolo/passando in quelle kwargs. Nel tuo caso, sarebbe 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) 

è più tardi usato da molte classi di visualizzazione (come in render_to_response(self.get_context_data)) che passa il dizionario grezzo context a self.response_class che di default django.template.TemplateResponse.

TemplateResponse sa come rendere se stessa e nella sua funzione resolve_context, infine converte il dizionario per un django.template.Context

È davvero possibile seguire l'origine tutta la strada dal metodo originale fino in fondo.

5

I kwargs vengono generati nella URLConf. Ad esempio ciò popolano l'elemento pk:

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

La chiamata è attraverso la funzione view in View.as_view e poi attraverso View.dispatch che chiama TemplateView.get.

Problemi correlati