Django表单验证错误 - TypeError 'str'对象不可调用
所以……我在这个问题上纠结了一段时间。当我尝试验证一个表单时,遇到了一个非常奇怪的错误。我传入一些输入数据,想测试当表单验证失败时的表现,也就是说,我预期它会验证失败。
这是我写的表单代码:
class CTAForm(forms.Form):
first_name = forms.CharField(max_length=50)
email = forms.EmailField()
phone = forms.CharField(max_length=15, required=False, label='Phone (optional)')
然后我在某个视图中调用这个代码来处理表单数据。
if cta_form.is_valid():
结果我得到了:
Exception Type: TypeError
Exception Value: 'str' object is not callable
Exception Location: /usr/lib/pymodules/python2.6/django/forms/forms.py in full_clean, line 246
错误追踪信息显示如下:
/usr/lib/pymodules/python2.6/django/forms/forms.py 在 full_clean:
- except ValidationError, e:
- self._errors[name] = self.error_class(e.messages) ...
▼ 本地变量
变量 值
e: ValidationError()
field: django.forms.fields.EmailField 对象在 <0x225c4d0c>
name: 'email'
self: blah.views.CTAForm 对象在 <0x2245b42c>
value: u' '
我感觉自己挺笨的。有没有人能给我一些关于这个问题的指导?谢谢。
编辑:根据要求,提供了更完整的视图代码
def cta_add(request):
context_dict = {'categories': Category.objects.all().order_by('order'),}
# we always expect to receive data via post
if request.method =='POST':
# get the current vid based on the parameter
current_vid = Video.objects.get(slug=request.POST['current_vid'])
# use this video to create our dynamic form so we get the valid cta values based on that video
cta_form_class = make_cta_form(current_vid.cta_set.all().order_by('order'))
# instantiate our new dynamic form based on the post data
cta_form = cta_form_class(request.POST, error_class='error')
# if we got this far, we were able to generate a form to validate the user's input against.
# If form validates, than process and take user to success screen
if cta_form.is_valid():
下面是辅助函数 make_cta_form
def make_cta_form(cta_set):
cta_list =[]
if not cta_set is None:
for cta in cta_set:
cta_list.append((cta.text, cta.text))
class CTAForm(forms.Form):
cta = forms.MultipleChoiceField(widget=forms.CheckboxSelectMultiple, choices=cta_list, label='', required=False)
first_name = forms.CharField(max_length=50)
email = forms.EmailField()
phone = forms.CharField(max_length=15, required=False, label='Phone (optional)')
return CTAForm
2 个回答
0
在你的 views.py
文件里。当用户填写完表单后,你是这样做的吗?
from your_app.forms import *
def process_form(request):
cta_form = CTAForm(request.POST)
if cta_form.is_valid():
# your code.
你需要把表单的 POST 数据作为构造函数的初始值传进去。
1
你遇到了一个错误,提示说字符串不能被调用,但你给表单设置的错误类是一个字符串,而不是一个错误类。
cta_form = cta_form_class(request.POST, error_class='error')
在文档中,我找到的关于error_class的唯一参考是一个字符串列表,所以你可以试试
cta_form = cta_form_class(request.POST, error_class=['error'])
不过,似乎更合理的做法是这样
import forms
[...]
cta_form = cta_form_class(request.POST, error_class=forms.ValidationError("error"))
或者可能是:
cta_form = cta_form_class(request.POST, error_class=forms.ValidationError)