当我有一个有效的Django表单时,我可以使用form.cleaned_data访问数据。但是,当表单无效时,即form.is_valid为false时,我如何获取用户输入的数据。
我正在尝试访问表单集中的表单,所以form.data似乎只会给我带来混乱。
当我有一个有效的Django表单时,我可以使用form.cleaned_data访问数据。但是,当表单无效时,即form.is_valid为false时,我如何获取用户输入的数据。
我正在尝试访问表单集中的表单,所以form.data似乎只会给我带来混乱。
form.data['field_name']
这种方式可以获取分配给字段的原始值。
form.data.get('field_name', None)
@Fuad form.data.get('field_name', None)
- Escher请查看http://docs.djangoproject.com/en/dev/ref/forms/validation/#ref-forms-validation
其次,一旦我们决定两个字段中的组合数据无效,我们必须记得将它们从cleaned_data中删除。
实际上,如果表单中有任何错误,Django当前将完全清除cleaned_data字典。但是,这种行为可能会在未来发生变化,因此最好首先自己做好清理工作。
原始数据始终可在request.POST
中使用。
评论建议要执行听起来更复杂的字段级验证。
每个字段都提供未经验证的数据,然后返回有效数据或引发异常。
在每个字段中,可以对原始内容进行任何类型的验证。
phone_number
得到的任何值,而不管它是否正确验证。 - Carl G我曾经遇到类似的问题,在这里找到了一个很好的讨论:https://code.djangoproject.com/ticket/10427
虽然文档不够清晰,但是对于一个实时表单,你可以通过以下方法查看字段值 -- 此处所见即所得:
form_name['field_name'].value()
MultipleHiddenInput
可以使用form.data.field_name.
返回一个项目,而form.field_name.value
则返回整个列表。 - augustomenis_valid()
为 false 的情况下更新这个字段? - KVISH我有很多方法,你可以选择任意一种。
我认为表单应该像下面这样:
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. 获取分配给字段的原始值
,并返回字段data
属性的值
def signup(req):
if req.method == 'POST':
...
sf = SignupForm(req.POST)
email = sf["email"].data
password = sf["password"].data
...
2-2. 获取分配给字段的原始值并返回字段value
属性的值。
def signup(req):
if req.method == 'POST':
...
sf = SignupForm(req.POST)
email = sf["email"].value()
password = sf["password"].value()
...
2-3. 获取分配给字段的 字典
def signup(req):
if req.method == 'POST':
...
sf = SignupForm(req.POST)
# print sf.data
# <QueryDict: {u'csrfmiddlewaretoken': [u'U0M9skekfcZiyk0DhlLVV1HssoLD6SGv'], u'password': [u''], u'email': [u'hello']}>
email = sf.data.get("email", '')
password = sf.data.get("password", '')
...
您可以使用这个模式:
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不是一个好的解决方案。原因如下:
dirty_rc1 = self.data[self.prefix + '-reg_choice_1']
然后,我可以测试该字段中是否存在数据:
if not dirty_rc1:
raise ValidationError('Make a first choice before second')
你可以从字段的clean()方法或表单的clean()方法中访问数据。clean()是确定表单是否有效的函数。当调用is_valid()时,它会被调用。在表单的clean()中,你有一个cleaned_data
列表,你可以通过自定义代码来确保它全部检查通过。在小部件中,你也有一个clean(),但它使用一个单独传递的变量。为了访问字段的clean()方法,你需要对其进行子类化。例如:
class BlankIntField(forms.IntegerField):
def clean(self, value):
if not value:
value = 0
return int(value)
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()函数后单独验证每个字段。