我试图用django的CBV创建一些对象FormView
form_class
的代码如下:
class UrlForm(forms.Form):
url = forms.CharField(required=True,
help_text=_("This should be an absolute path, excluding the domain name.\
Example: '/events/search/'."),
widget=forms.TextInput(attrs={'style':'width:400px;'}))
title = forms.CharField(required=True, widget=forms.Textarea())
description = forms.CharField(required=True, widget=forms.Textarea())
keywords = forms.CharField(required=True, widget=forms.Textarea())
def clean(self):
cleaned_data = super(UrlForm, self).clean()
url = cleaned_data.get('url')
try:
Url.objects.get(url=url)
raise forms.ValidationError("Seo Url already exists.")
except:
pass
return cleaned_data
我使用这个视图来呈现表单:
^{pr2}$该url应该是唯一的,因此如果存在具有相同的url,我将尝试引发ValidationError
值。但是问题是,它不进入form的clean方法,也不在form_valid
或form_invalid
中,它只是简单地射击post方法,并尝试创建url和seo对象。为什么我的表单的clean方法/form_有效/无效没有被调用。。我真是束手无策!!在
你的post方法错误。您必须使用如下形式的有效方法
或者,如果要使用Post方法,请如下所示:
^{pr2}$我已经测试了代码,但它会工作的。让我解释一下你的代码为什么不起作用。在post方法中,没有使用post参数初始化窗体。一旦窗体被初始化,就可以运行clean方法,如果有异常,它将引发异常。另外,由于您使用的是FormView,所以有一个form\u有效的方法(我的建议是在开发之前先阅读)。另一个建议是,既然您使用表单来创建对象,为什么不使用CreateView和ModelForm。。:)
这行不通,因为您要重写视图中的整个}方法。在
post
方法。默认情况下,post
方法负责对表单调用验证,然后调用form_valid
或{如果您根本不使用表单,那么使用
FormView
有什么意义呢。在另外:应该引用表单的
cleaned_data
,而不是request.POST
。它将只包含完全清除的数据。在调用clean时,必须使用self返回clean数据
相关问题 更多 >
编程相关推荐