【问题标题】:Django: form_valid() takes exactly 2 arguments (3 given)Django:form_valid() 只需要 2 个参数(给定 3 个)
【发布时间】:2016-03-25 00:58:38
【问题描述】:

我有一个用于现场应急照明测试的 CreateView。它从 url 获取站点,因此用户无需将其输入到表单中。 CreateView 还有一个应急照明设备表单集,可将多个设备附加到主测试。当我在表单上点击提交时,我得到了

form_valid() 只接受 2 个参数(给定 3 个)

models.py

class Site(models.Model):
    ....

class EmergencyLighting(models.Model):
    site = models.ForeignKey(Site)

class EmergencyLightingDevice(models.Model):
    emergency_lighting = models.ForeignKey(EmergencyLighting)

views.py

class FormsetMixin(object):
    object = None

    def get(self, request, *args, **kwargs):
        if getattr(self, 'is_update_view', False):
            self.object = self.get_object()
        form_class = self.get_form_class()
        form = self.get_form(form_class)
        formset_class = self.get_formset_class()
        formset = self.get_formset(formset_class)
        return self.render_to_response(self.get_context_data(form=form, formset=formset))

    def post(self, request, *args, **kwargs):
        if getattr(self, 'is_update_view', False):
            self.object = self.get_object()
        form_class = self.get_form_class()
        form = self.get_form(form_class)
        formset_class = self.get_formset_class()
        formset = self.get_formset(formset_class)
        if form.is_valid() and formset.is_valid():
            return self.form_valid(form, formset)
        else:
            return self.form_invalid(form, formset)

    def get_formset_class(self):
        return self.formset_class

    def get_formset(self, formset_class):
        return formset_class(**self.get_formset_kwargs())

    def get_formset_kwargs(self):
        kwargs = {
            'instance': self.object
        }
        if self.request.method in ('POST', 'PUT'):
            kwargs.update({
                'data': self.request.POST,
                'files': self.request.FILES,
            })
        return kwargs

    def form_valid(self, form, formset):
        self.object = form.save()
        formset.instance = self.object
        formset.save()
        return redirect('/sites/list')

    def form_invalid(self, form, formset):
        return self.render_to_response(self.get_context_data(form=form, formset=formset))


class EmergencyLightingCreate(FormsetMixin, CreateView):
    template_name = 'emergency_lighting/emergencylighting_form.html'
    model = EmergencyLighting
    form_class = EmergencyLightingForm
    formset_class = EmergencyLightingFormSet

    def form_valid(self, form):
        emergency_lighting = form.save(commit=False)
        emergency_lighting.site_id = self.kwargs['site']

        return super(EmergencyLightingCreate, self).form_valid(form)

forms.py

class EmergencyLightingForm(forms.ModelForm):
    class Meta:
        model = EmergencyLighting
        exclude = ('creation', 'last_modified')


class EmergencyLightingDeviceForm(forms.ModelForm):
    class Meta:
        model = EmergencyLightingDevice
        exclude = ('creation', 'last_modified')

EmergencyLightingFormSet = inlineformset_factory(EmergencyLighting, EmergencyLightingDevice,
                                                 extra=0, min_num=1, exclude=('creation', 'last_modified'))

urls.py

url(r'^(?P<site>[0-9]+)/create/$', EmergencyLightingCreate.as_view(), name='emergency-lighting-create'),

【问题讨论】:

  • 错误出现在哪里?您在这里包含了很多代码,但并非所有代码看起来都相关(即get_formset 方法等)请包含堆栈跟踪并尝试仅包含与您的问题相关的信息

标签: python django


【解决方案1】:

就像错误所说的那样,您将三个参数传递给form_valid;那是因为您明确地覆盖了post 以发送这三个,并修改了 FormsetMixin 中form_valid 的签名以接受它们。但是,在 EmergencyLightingCreate 中,您已恢复为只接受两个参数。在子类化时,您需要对方法接受的参数数量保持一致。

【讨论】:

    猜你喜欢
    • 2011-08-12
    • 1970-01-01
    • 1970-01-01
    • 2015-02-18
    • 1970-01-01
    • 1970-01-01
    • 2012-03-04
    • 2012-05-18
    • 1970-01-01
    相关资源
    最近更新 更多