Django形式is_valid()失败,并且add_error()接受2个位置参数,但给出了3个

我正在创建带有条纹订阅的新闻站点。以下代码在is_valid()检查中失败。但是我不明白为什么:表单应该从POST数据中填充数据吗?

型号:

class CustomUser(models.Model):
    full_name = models.CharField(max_length=255)
    email = models.EmailField()
    stripe_id = models.CharField(max_length=255)

ModelForm:

class CustomUserForm(ModelForm):

    class Meta:
        model = CustomUser
        fields = ("full_name","email","stripe_id")

    def add_error(self,message):
        # pylint: disable=E1101
        self._errors[NON_FIELD_ERRORS] = self.error_class([message])

查看功能:

def charge(request): 
    if request.method == 'POST':
        form = CustomUserForm(request.POST)
        if form.is_valid():
            try:
                charge = stripe.Charge.create(
                    amount=10000,currency='usd',description=form.cleaned_data['email'],source=request.POST['stripeToken'],card=form.cleaned_data['stripe_id'],)

                form.save()
                return redirect('home')

            except stripe.error.CardError:
                form.add_error("The card has been declined.")
        else:
            print("Form is not valid")
    else:
        form = CustomUserForm()

    args = {}
    args.update(csrf(request))
    args['form'] = form
    args['publishable'] = settings.STRIPE_PUBLISHABLE_KEY
    args['months'] = range(1,13)
    args['years'] = range(2013,2038)
    args['soon'] = datetime.date.today() + datetime.timedelta(days=30)

    return render(request,'accounts/charge.html',args)

我发现了类似的话题并尝试了很多。但是我仍然被困住。 运行此命令时,它将返回add_error() takes 2 positional arguments but 3 were given,并突出显示此form.is_valid()行。 我也尝试在没有add_error的情况下运行它,然后发现该表格无效。 我正在使用python3.7和Django 2.2.6。

fghjq 回答:Django形式is_valid()失败,并且add_error()接受2个位置参数,但给出了3个

您正在覆盖表单类上的现有add_error方法-您可以在此处查看源代码:https://github.com/django/django/blob/master/django/forms/forms.py#L307

is_valid的内部调用带有字段和错误消息的self.add_error,因此当您覆盖add_error以仅接收错误消息时,is_valid中的调用将被中断

我建议将您的自定义add_error方法重命名为与Form类不冲突的其他名称,或者以与内部使用相同的方式使用add_error,如果您希望该错误为NON_FIELD_ERROR,则为该字段输入None,如下所示:

# change your view code to this after deleting your `add_error` method for the same result
form.add_error(None,"The card has been declined.")
本文链接:https://www.f2er.com/3163020.html

大家都在问