设置类变量,而不是在“ CreateView”中使用多余的局部变量

时间:2019-05-27 20:45:14

标签: python django django-views

我创建了一个继承自

的视图类
  

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 :(得分:0)

最后,我在https://docs.djangoproject.com/en/2.2/ref/class-based-views/base/#django.views.generic.base.View中找到了django.views.generic.base.View的流程图:

  1. setup()
  2. dispatch()
  3. http_method_not_allowed()
  4. options()

根据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)