【发布时间】:2015-07-29 18:46:17
【问题描述】:
如果我在表单上调用is_valid(),我还需要清理forms.py 中的数据吗?我觉得它是多余的。我知道is_valid()是假设自动运行clean(),那么框架为什么会让用户使用forms.py中的clean()函数呢?
forms.py
from django.core.validators import RegexValidator
my_validator = RegexValidator("\d{6}\-\d{2}", "CAPA format needs to be ######-##.")
class IncidentSearchForm(forms.Form):
id = forms.IntegerField(required=False)
user_id = forms.ModelChoiceField(User.objects.all(), required=False)
capa = forms.CharField(
label="CAPA",
required=False,
validators=[my_validator]
)
def search(self):
id = self.cleaned_data.get('id')
user_id = self.cleaned_data.get('user_id')
capa = self.cleaned_data.get('capa', None)
if id is not None:
query = query.filter(id=id))
if user_id is not None:
query = query.filter(user_id=user_id)
if capa is not '':
query = query.filter(capa=capa)
return(query)
view.py
@login_required(login_url='/login/')
def index(request):
template = "index.html"
form = IncidentSearchForm(request.GET) # or None
incident_list = None
if form.is_valid():
incident_list = form.search()
context = { "form": form,
"incident_list": incident_list}
return render(request, template, context)
else:
# form is empty show all OPEN incidents
form = IncidentSearchForm()
incident_list = Incident.objects.filter(open = 'True').order_by('-incident_date_time_reported')
context = { "form": form,
"incident_list": incident_list}
return render(request, template, context)
【问题讨论】:
-
您不需要在表单上调用 clean。就像你说的,当你调用 .is_valid() 时它会这样做。如果要执行任何自定义验证,则调用/覆盖 clean
-
好的,那么我在上面的代码中做了什么不必要或多余的事情吗?我一直觉得
self.cleaned_data.get是多余的,因为我在views.py 中调用is_valid()。我开始明白了。我会覆盖capa的清理 -
self.cleaned_data.get在 is_valid 调用clean后得到结果。
标签: django forms validation