Пример общего представления на основе классов в Django: откуда взялись ** kwargs? - PullRequest
7 голосов
/ 27 октября 2011

В примерах я постоянно вижу, как проходили ** кварги, не упоминая, откуда они берутся:

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

Откуда ** магически вырваны ** карги?

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

Ответы [ 2 ]

5 голосов
/ 27 октября 2011

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...