我正在创建带条带订阅的新闻网站。以下代码在is_valid()检查中失败。但我不明白为什么:表格是否应该从POST数据中填写数据
型号:
class CustomUser(models.Model):
full_name = models.CharField(max_length=255)
email = models.EmailField()
stripe_id = models.CharField(max_length=255)
模型形式:
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
您正在覆盖表单类上现有的
add_error
方法-您可以在此处看到源代码:https://github.com/django/django/blob/master/django/forms/forms.py#L307is_valid
的内部使用字段和错误消息调用self.add_error
,因此当您重写add_error
以仅获取错误消息时,is_valid
中的调用被中断我建议将您的自定义
add_error
方法重命名为与Form
类不冲突的其他方法,或者以与内部使用相同的方式使用add_error
,如果希望错误为非None
字段,则为该字段传递None
,如下所示:相关问题 更多 >
编程相关推荐