Пример представления Django на основе классов: откуда происходит ** kwargs?

В примерах я постоянно вижу, что ** 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 магически вырваны?

Кроме того, не кажется ли это чем-то большим, чем просто добавление одного словарного объекта?

+7
источник поделиться
2 ответа

Посмотрите на базовую реализацию 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, кварги "магически выщипываются" из того, что называет это/проходит в этих кваргах. В вашем случае это будет 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

Вы действительно можете полностью отслеживать исходный путь от исходного метода до конца.

+5
источник

Квадраты генерируются в URLConf. Например, это заполнит элемент pk:

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

Вызов осуществляется через view в View.as_view, а затем через View.dispatch, который вызывает TemplateView.get.

+5
источник

Связанные вопросы


Похожие вопросы

Посмотрите другие вопросы по метке или Задайте вопрос