Почему атрибуты объекта в __init __ () и get_context_data () отличаются? - PullRequest
1 голос
/ 11 марта 2020
class SomeView(DetailView) :
    def __init__(self, *kwargs):
        print(type(self), dir(self)) 
    def get_context_data:
        print(type(self), dir(self)) 

__ init__ не печатает «атрибут запроса» для dir (self), но печатает get_context_data ().

Почему такая разница?

1 Ответ

2 голосов
/ 11 марта 2020

Запрос не установлен __init__ представления. Действительно, он устанавливается функцией setup :

    def setup(self, request, *args, **kwargs):
        """Initialize attributes shared by all view methods."""
        <b>self.request = request</b>
        self.args = args
        self.kwargs = kwargs

Эта настройка выполняется после View объект построен. Действительно, если вы используете .as_view(), он возвращает функцию, которая в основном является view функцией :

        def view(request, *args, **kwargs):
            self = cls(**initkwargs)
            if hasattr(self, 'get') and not hasattr(self, 'head'):
                self.head = self.get
            <b>self.setup(request, *args, **kwargs)</b>
            if not hasattr(self, 'request'):
                raise AttributeError(
                    "%s instance has no 'request' attribute. Did you override "
                    "setup() and forget to call super()?" % cls.__name__
                )
            return self.dispatch(request, *args, **kwargs)

Таким образом, сначала создает selfself = cls(**initkwargs)), а затем вызовет self.setup(request, *args, **kwargs), чтобы установить объект request вместе с args и kwargs.

Если вам нужно что-то сделать после того, как установлен request, вы можете переопределить метод setup. Например:

class SomeView(DetailView):

    def <b>setup</b>(self, *args, **kwargs):
        super().setup(*args, **kwargs)
        print(dir)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...