Аттитюды "исчезают" из CBV. Джанго
Я пытаюсь построить CBV с классом View parent. Это представление берет slug объекта и находит этот объект между двумя моделями django. Функции из services.py делали много запросов к БД, поэтому я попытался уменьшить их количество, передав FeedbackSection необходимые атрибуты (slug, model_instance и context) и в последнее время переопределяя их в методе get.
class FeedbackSection(View):
"""
Feedback section for different objects.
This is something like 'generic' view, so I implement it that it will find
the model and feedbacks for this model by having only slug.
"""
template_name = 'feedbacks/feedback-section.html'
form_class = CreateFeedbackForm
slug = None
model_instance = None
context = None
def get(self, request, *args, **kwargs):
self.slug = kwargs.get('slug')
self.model_instance = get_model_instance(self.slug)
self.context = get_feedback_section_context(self.slug, self.form_class, self.model_instance)
return render(request, self.template_name, self.context)
@method_decorator(login_required)
def post(self, request, *args, **kwargs):
form = self.form_class(request.POST)
if form.is_valid():
# will create feedback object and update model[Advert, Company] rating.
end_feedback_post_logic(self.request.user, form, self.model_instance)
return render(request, self.template_name, self.context)
Атрибуты (slug, model_instance и context), когда post метод находится в runtime эквивалентны None. Проблема в том, что вчера эта реализация работала нормально, а сегодня нет.
Я знаю, что могу снова использовать свои функции, но в пост-методе. Я не хочу этого делать. Потому что это увеличит количество запросов к БД в два раза.
Нам нужно переопределить метод setup класса View и определить там эти атрибуты.
def setup(self, request, *args, **kwargs):
self.slug = kwargs.get('slug')
self.model_instance = get_model_instance(self.slug)
self.context = get_feedback_section_context(
self.slug,
self.form_class,
self.model_instance
)
return super().setup(request, *args, **kwargs)