Oz1*_*123 1 python django django-forms
虽然我阅读了文档,但我对django表单验证感到很遗憾.
我已经定义了以下形式:
class NewProjAccount(NewAccount):
def __init__(self, perforce='', *args, **kwargs):
super(NewProjAccount, self).__init__(*args, **kwargs)
print perforce
if 'on' in perforce:
self.fields['perforce_depot_size'].widget.attrs[
'required'] = True
site = forms.ChoiceField(choices=SITE_CHOICES, required=False,
label="Site")
project_name = forms.CharField(max_length=25, required=True,)
disk_usage = forms.IntegerField(max_value=PROJ_MAX_SIZE_GB,
)
homes = forms.MultipleChoiceField(choices=SITE_CHOICES, required=False,
widget=
forms.widgets.CheckboxSelectMultiple(),
label="Remote Homes")
perforce_depot = forms.BooleanField(required=False)
perforce_depot_size = forms.IntegerField(max_value=PERFORCE_MAX_SIZE_GB,
required=False)
class ReviewProjAccount(NewProjAccount):
site = forms.CharField(max_length=20, required=False,
label="Site")
project_name = forms.CharField(max_length=25, required=True,)
homes = forms.CharField(label="Remote Homes")
perforce_depot = forms.BooleanField(required=False,
widget=forms.widgets.CheckboxInput(
attrs={'disabled': 'disabled'}))
Run Code Online (Sandbox Code Playgroud)
两种形式都继承自:
class NewAccount(forms.Form):
"""
Base class for all the account type
"""
def __init__(self, readonly=False, *args, **kwargs):
super(NewAccount, self).__init__(*args, **kwargs)
if readonly:
for field in self.fields.itervalues():
field.widget.attrs['readonly'] = 'readonly'
Run Code Online (Sandbox Code Playgroud)
我的想法是使用这样的形式:
if request.method == 'POST':
try:
form = NewProjAccount(perforce=request.POST['perforce_depot'],
data=request.POST)
except MultiValueDictKeyError:
print "caugh"
if request.POST['perforce_depot_size']:
form = ReviewProjAccount(data=initial_val,
readonly=True)
else:
form = NewProjAccount(data=request.POST)
Run Code Online (Sandbox Code Playgroud)
但是,这会产生一个非常复杂的视图函数,可能是'if'和'else'以及'try ... example'...
有没有一种简单的方法来定义表单中的字段之间的关系,这样当它是一个时True,它会触发另一个字段的验证器?
在我的情况,我想,当用户选择:
perforce_depot = True或者'on'在perforce_depot_size应该有属性required设置为True.
您可以查看清理和验证彼此依赖的字段
from django import forms
class NewProjAccount(forms.Form):
#form attributes
def clean(self):
cleaned_data = super(NewProjAccount, self).clean()
perforce_depot = cleaned_data.get("perforce_depot")
perforce_depot_size = cleaned_data.get("perforce_depot_size")
if perforce_depot and not perforce_depot_size:
raise forms.ValidationError("perforce_depot_size needs to be set to true.")
# Always return the full collection of cleaned data.
return cleaned_data
Run Code Online (Sandbox Code Playgroud)
另外,我建议你看一下django的ModelForm,这会极大地减少你的代码,并且会让它变得更简单
| 归档时间: |
|
| 查看次数: |
1344 次 |
| 最近记录: |