窗体的clean方法未被调用

2024-09-24 22:27:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用django的CBV创建一些对象FormViewform_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_validform_invalid中,它只是简单地射击post方法,并尝试创建url和seo对象。为什么我的表单的clean方法/form_有效/无效没有被调用。。我真是束手无策!!在


Tags: 对象方法formcleantrueurldatarequired
3条回答

你的post方法错误。您必须使用如下形式的有效方法

def form_valid(self, form):
    url = Url.objects.create(url= form.cleaned_data['url'])
    seo = Seo.objects.create(
                title = form.cleaned_data['title'],
                description = form.cleaned_data['description'],
                keywords = form.cleaned_data['keywords'],
                content_object=url)

    return redirect(self.get_success_url())

或者,如果要使用Post方法,请如下所示:

^{pr2}$

我已经测试了代码,但它会工作的。让我解释一下你的代码为什么不起作用。在post方法中,没有使用post参数初始化窗体。一旦窗体被初始化,就可以运行clean方法,如果有异常,它将引发异常。另外,由于您使用的是FormView,所以有一个form\u有效的方法(我的建议是在开发之前先阅读)。另一个建议是,既然您使用表单来创建对象,为什么不使用CreateView和ModelForm。。:)

这行不通,因为您要重写视图中的整个post方法。默认情况下,post方法负责对表单调用验证,然后调用form_valid或{}方法。在

如果您根本不使用表单,那么使用FormView有什么意义呢。在

另外:应该引用表单的cleaned_data,而不是request.POST。它将只包含完全清除的数据。在

调用clean时,必须使用self返回clean数据

def clean(self):
    url = self.cleaned_data.get('url')
    try:
        my_url = Url.objects.get(url=url)
        if my_url:
            raise forms.ValidationError("Seo Url already exists.")
    except Url.DoesNotExist:
        pass
    return self.cleaned_data

相关问题 更多 >