установка переменной класса вместо работы с избыточными локальными переменными в CreateView - PullRequest
0 голосов
/ 27 мая 2019

Я создал класс представления, унаследованный от

django.views.generic.CreateView

Все работает нормально, но у меня есть два раза следующую строкукод в двух разных методах класса:

event = get_object_or_404(Event, pk=self.kwargs['pk'])

Я уже пытался установить переменную класса в методе init , но все, что я пробовал, заканчивалось сообщениями об ошибках.

Вот мой класс с двумя лишними строками:

class StaffCreateView(CreateView):
    model = Staff
    form_class = StaffForm

    def get_initial(self):
        """
        Returns the initial data to use for forms on this view.
        """
        initial = super().get_initial()

        event = get_object_or_404(Event, pk=self.kwargs['pk'])

        initial['country'] = event.default_country_of_staff
        initial['max_number_of_shifts'] = event.default_max_number_of_shifts_per_staff

        return initial

    def form_valid(self, form):
        event = get_object_or_404(Event, pk=self.kwargs['pk'])
        form.instance.event = event
        return super().form_valid(form)

Может ли кто-нибудь подсказать мне, как это сделать правильно?

1 Ответ

0 голосов
/ 31 мая 2019

Наконец я нашел блок-схему django.views.generic.base.View в https://docs.djangoproject.com/en/2.2/ref/class-based-views/base/#django.views.generic.base.View:

  1. Настройка ()
  2. отправка ()
  3. http_method_not_allowed ()
  4. опции ()

В соответствии с описанием метода setup(), я думаю, что это место для установки атрибута моего экземпляра self.event

Итак, мой класс теперь выглядит так:

class StaffCreateView(CreateView):
model = Staff
form_class = StaffForm

def setup(self, request, *args, **kwargs):
    super().setup(request, *args, **kwargs)
    self.event = get_object_or_404(Event, pk=self.kwargs['pk'])


def get_initial(self):
    """
    Returns the initial data to use for forms on this view.
    """
    initial = super().get_initial()

    initial['country'] = self.event.default_country_of_staff
    initial['max_number_of_shifts'] = self.event.default_max_number_of_shifts_per_staff

    return initial

def form_valid(self, form):
    form.instance.event = self.event
    return super().form_valid(form)
...