Можно ли установить переменные экземпляра в представлении класса на основе 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.
Ответы
Ответ 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
. Он чувствует себя как-то чище.