当我有一个有效的Django表单时,我可以使用form.cleaned_data访问数据。但是,当表单无效时,如何获取用户输入的数据,即form.is_valid为false。
我正在尝试访问表单集中的表单,因此form.data似乎只是让我一团糟。
答案 0 :(得分:42)
您可以使用
form.data['field_name']
这样您就可以获得分配给该字段的原始值。
答案 1 :(得分:17)
请参阅http://docs.djangoproject.com/en/dev/ref/forms/validation/#ref-forms-validation
其次,一旦我们决定了 我们在两个领域的综合数据 正在考虑无效,我们必须 记得从中删除它们 cleaned_data。
事实上,Django目前会 彻底清除cleaning_data 字典,如果有任何错误 表格。但是,这种行为可能会 改变未来,所以它不是一个 在你自己之后清理的坏主意 第一名。
原始数据始终位于request.POST
。
评论表明,重点是做一些听起来更复杂的字段级验证。
每个字段都有未经验证的数据,并返回有效数据或引发异常。
在每个字段中,可以对原始内容进行任何类型的验证。
答案 2 :(得分:13)
我正在努力解决类似的问题,并在这里遇到了一个很好的讨论:https://code.djangoproject.com/ticket/10427
根本没有详细记录,但对于实时表单,您可以使用以下内容查看字段的值(如窗口小部件/用户所示):
form_name['field_name'].value()
答案 3 :(得分:8)
我有很多方法。你可以选择所有。
我认为表格如下:
class SignupForm(forms.Form):
email = forms.CharField(label='email')
password = forms.CharField(label='password',
widget=forms.PasswordInput)
1-1。从request
def signup(req):
if req.method == 'POST':
email = req.POST.get('email', '')
password = req.POST.get('password', '')
2-1。获取分配给该字段的raw value
并返回字段<{1}}属性的值
data
2-2。获取分配给该字段的原始值,并返回字段
的def signup(req):
if req.method == 'POST':
...
sf = SignupForm(req.POST)
email = sf["email"].data
password = sf["password"].data
...
属性的值
value
2-3。获取分配给字段的def signup(req):
if req.method == 'POST':
...
sf = SignupForm(req.POST)
email = sf["email"].value()
password = sf["password"].value()
...
dictionary
答案 4 :(得分:5)
您可以使用此模式:
class MyForm(forms.Form):
...
def clean(self):
self.saved_data=self.cleaned_data
return self.cleaned_data
在您的代码中:
if form.is_valid():
form.save()
return django.http.HttpResponseRedirect(...)
if form.is_bound:
form.saved_data['....'] # cleaned_data does not exist any more, but saved_data does.
使用form.data不是一个好的解决方案。原因:
答案 5 :(得分:3)
我使用formset遇到了类似的问题。在我的示例中,我希望用户在第二个选择之前选择第一个选项,但如果第一个选项遇到另一个错误,则还会显示“在第二个选择之前选择第一个选项”错误。
要获取第一个字段的未清除数据,我在表单字段的清理方法中使用了它:
dirty_rc1 = self.data[self.prefix + '-reg_choice_1']
然后,我可以测试该字段中是否存在数据:
if not dirty_rc1:
raise ValidationError('Make a first choice before second')
希望这有帮助!
答案 6 :(得分:1)
您可以从字段的clean()方法或表单的clean()方法访问数据。 clean()是确定表单是否有效的函数。调用is_valid()时调用它。在表单的clean()中,当您可以运行自定义代码以确保全部签出时,您有cleaned_data
列表。在窗口小部件中,您还有一个clean(),但它使用单个传递的变量。为了访问字段的clean()方法,你必须将它子类化。 e.g:
class BlankIntField(forms.IntegerField):
def clean(self, value):
if not value:
value = 0
return int(value)
例如,如果你想要一个没有扼杀空值的IntField,你可以使用上面的内容。
表单上的clean()类似:
def clean(self):
if self.cleaned_data.get('total',-1) <= 0.0:
raise forms.ValidationError("'Total must be positive")
return self.cleaned_data
此外,您可以为每个字段设置clean_FIELD()函数,以便您可以单独验证每个字段(在调用字段的clean()之后)