Подтвердить что ты не робот

Можно ли установить переменные экземпляра в представлении класса на основе Django?

Я пытаюсь просмотреть Django-классы (CBV).

class BlahView(TemplateView):
    template_name = 'blah/blah.html'
    def get_context_data(self, **kwargs):
        #code...

    def get(self, request, **kwargs):
        #more code...

Теперь я знаю, что могу получить параметры запроса от self.request. Теперь скажите, что я хочу проанализировать эти параметры запроса и сохранить их в классе. Могу ли я сохранить их в self.xxx? Теперь, очевидно, основываясь на том, как работают классы, это кажется простым.

Но я не могу разобраться в потоке управления, глядя на определение View (суперкласс из TemplateView). В источнике упоминается as_view() как "точка входа"

Я подумал о том, чтобы установить мои переменные экземпляра в начале get_context_data(), но, похоже, не имеет права делать там инициализацию.

Могу ли я определить __init__() для моего CBV? Если да, будут ли проблемы с потоками или что-то, что может работать с несколькими экземплярами страниц с глобальным экземпляром моих проанализированных данных?

Я знаю, это звучит немного беспорядочно, но я немного запутался в потоке кода в CBV.

4b9b3361

Ответ 1

В соответствии с источником django.views.generic.base.View.as_view:

  • при запуске django, as_view() возвращает функцию view, которая не называется
  • по запросу, view() называется, он создает экземпляр класса и вызывает dispatch()
  • экземпляр класса является потокобезопасным

В соответствии с источником django.views.generic.base.View.__init__ объект запроса в данный момент выходит за пределы области, поэтому вы не можете его разобрать в своей перегрузке конструктора.

Однако вы можете разобрать запрос и установить атрибуты экземпляра класса при перегрузке django.views.generic.base.View.dispatch, это безопасно в соответствии с источником:

class YourView(SomeView):
    def dispatch(self, request, *args, **kwargs):
        # parse the request here ie.
        self.foo = request.GET.get('foo', False)

        # call the view
        return super(YourView, self).dispatch(request, *args, **kwargs)

Ответ 2

@jpic дал отличный ответ. Вдохновленный от этого, я хотел бы ссылаться на следующий пост в блоге, где автор утверждает, что:

... Мы не можем переопределить представление, так как это потребует переопределения as_view(). Переопределение отправки() является привлекательным (и то, что я сделал первоначально, когда я представил этот разговор), потому что он предлагает один простое место для этого, но это не соответствует логике отправки(). Вместо этого лучше всего называть set_account() в переопределении как get() и post()....

Поэтому можно переопределить методы get или post и установить любые переменные self.whatever. Он чувствует себя как-то чище.