首页 > 解决方案 > 在“CreateView”中设置类变量而不是使用冗余的局部变量

问题描述

我创建了一个视图类继承自

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)

有人可以指导我如何以正确的方式做到这一点吗?

标签: pythondjangodjango-views

解决方案


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)

推荐阅读