0

Чтение через исходный код для View Classоснове Просмотров Джанго Класс: Понимание аргументы в представлении класса

Исходный код:

class View(object): 
""" 
Intentionally simple parent class for all views. Only implements 
dispatch-by-method and simple sanity checking. 
""" 

http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace'] 

def __init__(self, **kwargs): 
    """ 
    Constructor. Called in the URLconf; can contain helpful extra 
    keyword arguments, and other things. 
    """ 
    # Go through keyword arguments, and either save their values to our 
    # instance, or raise an error. 
    for key, value in six.iteritems(kwargs): 
     setattr(self, key, value) 

@classonlymethod 
def as_view(cls, **initkwargs): 
    """ 
    Main entry point for a request-response process. 
    """ 
    for key in initkwargs: 
     if key in cls.http_method_names: 
      raise TypeError("You tried to pass in the %s method name as a " 
          "keyword argument to %s(). Don't do that." 
          % (key, cls.__name__)) 
     if not hasattr(cls, key): 
      raise TypeError("%s() received an invalid keyword %r. as_view " 
          "only accepts arguments that are already " 
          "attributes of the class." % (cls.__name__, key)) 

    def view(request, *args, **kwargs): 
     self = cls(**initkwargs) 
     if hasattr(self, 'get') and not hasattr(self, 'head'): 
      self.head = self.get 
     self.request = request 
     self.args = args 
     self.kwargs = kwargs 
     return self.dispatch(request, *args, **kwargs) 
    view.view_class = cls 
    view.view_initkwargs = initkwargs 

    # take name and docstring from class 
    update_wrapper(view, cls, updated=()) 

    # and possible attributes set by decorators 
    # like csrf_exempt from dispatch 
    update_wrapper(view, cls.dispatch, assigned=()) 
    return view 

def dispatch(self, request, *args, **kwargs): 
    # Try to dispatch to the right method; if a method doesn't exist, 
    # defer to the error handler. Also defer to the error handler if the 
    # request method isn't on the approved list. 
    if request.method.lower() in self.http_method_names: 
     handler = getattr(self, request.method.lower(), self.http_method_not_allowed) 
    else: 
     handler = self.http_method_not_allowed 
    return handler(request, *args, **kwargs) 

def http_method_not_allowed(self, request, *args, **kwargs): 
    logger.warning('Method Not Allowed (%s): %s', request.method, request.path, 
     extra={ 
      'status_code': 405, 
      'request': request 
     } 
    ) 
    return http.HttpResponseNotAllowed(self._allowed_methods()) 

Я понимаю, что когда URLconf загружен, as_view класс только метод. as_view вызывает метод view, который создает объект View с self= cls(**initkwargs), а затем запускается __init__.

Я смущаюсь с выяснением разницы между **kwargs, которая берется методом view и **initkwargs, которые используются при создании экземпляра класса. Я предполагаю, что метод view передан всем аргументам через **kwargs ... тогда почему же не self= cls(**initkwargs) строка, написанная как self = cls(**kwargs)?

В чем разница между **initkwargs и **kwargs?

ответ

1

as_view называет view метод, который инстанцирует View объект с self= cls(**initkwargs) и затем __init__ пробегов.

На самом деле нет, этого не происходит. as_view не вызывает view Функция (view - не метод), as_view создает функцию view и возвращает ее, поэтому ее можно назвать позже. initkwargs передаются в as_view при обработке URL-адресов, kwargs передаются в поле зрения, когда диспетчер URL-адресов вызывает его при получении определенного URL-адреса. Вот почему kwargs и initkwargs не то же самое.

+0

Значения '** initkwargs' и' ** kwargs' отличаются? Диспетчер URL-адресов передает 'view (запрос, ** args, ** kwargs)' аргументы, содержащиеся в URL как ** kwargs, правильно? Тогда что такое/- значение (ы) '** initkwarg'? Они также найдены в URL? Или они происходят из чего-то другого? –

+0

Nevermind Я понимаю. Можно, например, подклассифицировать класс базового представления с помощью TemplateView. Если вы это сделаете, вы можете переопределить имя шаблона по умолчанию, передав его as_view. Затем аргументы из URL добавляются в функцию просмотра –

0

Код просто делает явное различие между жестко закодированными kwargs, которые вы передаете от urlconf, к созданию самого класса представления и динамическим kwargs, которые вы передаете из URL-адреса, когда представление действительно называется.

 Смежные вопросы

  • Нет связанных вопросов^_^