sat*_*ace 5 python django django-forms cleaned-data
我正在尝试验证数据库中是否已存在提交的URL.
Form类的相关部分如下所示:
from django.contrib.sites.models import Site
class SignUpForm(forms.Form):
# ... Other fields ...
url = forms.URLField(label='URL for new site, eg: example.com')
def clean_url(self):
url = self.cleaned_data['url']
try:
a = Site.objects.get(domain=url)
except Site.DoesNotExist:
return url
else:
raise forms.ValidationError("That URL is already in the database. Please submit a unique URL.")
def clean(self):
# Other form cleaning stuff. I don't *think* this is causing the grief
Run Code Online (Sandbox Code Playgroud)
问题是,无论我提交什么价值,我都无法提出ValidationError.如果我在clean_url()方法中做了类似的事情:
if Site.objects.get(domain=url):
raise forms.ValidationError("That URL is already in the database. Please submit a unique URL.")
Run Code Online (Sandbox Code Playgroud)
然后我收到一个DoesNotExist错误,即使对于已经存在于数据库中的URL也是如此.有任何想法吗?
IRC 中的 django 频道救了我。问题是 URLField.clean() 做了两件事我没有预料到:
结果被返回并存储在表单的cleaned_data 中。所以我正在检查cleaned_data['url']期待类似的东西example.com并且实际上得到了http://example.com/。可以说,将我的clean_url()方法更改为以下作品:
def clean_url(self):
url = self.cleaned_data['url']
bits = urlparse(url)
dom = bits[1]
try:
site=Site.objects.get(domain__iexact=dom)
except Site.DoesNotExist:
return dom
raise forms.ValidationError(u'That domain is already taken. Please choose another')
Run Code Online (Sandbox Code Playgroud)