gpt4 book ai didi

python - 窗体的干净方法没有被调用

转载 作者:太空宇宙 更新时间:2023-11-04 07:37:09 24 4
gpt4 key购买 nike

我正在尝试使用 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

我使用这个 View 来呈现表单:

class CreateSeoByUrl(FormView):
template_name = 'create_seo_by_url.html'
form_class = UrlForm

def get_success_url(self):
return reverse('dashboard:index')

def post(self, request, *args, **kwargs):
url = Url.objects.create(url= request.POST.get('url'))
seo = Seo.objects.create(
title = request.POST.get('title'),
description = request.POST.get('description'),
keywords = request.POST.get('keywords'),
content_object=url)

return redirect(self.get_success_url())

url 应该是唯一的,所以如果存在具有相同值的 url,我会尝试引发 ValidationError。但要注意的是,它不会进入表单的 clean 方法,也不会进入 form_validform_invalid,它只是发送到 post 方法并尝试创建 url 和 seo 对象。为什么我的表单的 clean 方法/form_valid/invalid 没有被调用..我束手无策!

最佳答案

您的发帖方式有误。您必须使用如下所示的 form_valid 方法

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 方法,请像下面这样使用它:

def post(self, request, *args, **kwargs):
form = self.form_class(request.POST)
if form.is_valid():
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 方法中,您没有使用 post 参数初始化表单。初始化表单后,您可以运行 clean 方法,它会引发异常(如果有)。此外,由于您使用的是 FormView,因此有一个 form_valid 方法(我的建议是在开发之前先阅读)。另一个建议,既然你正在使用表单来创建对象,为什么不使用 CreateView 和 ModelForm .. :)

关于python - 窗体的干净方法没有被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32065946/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com