Python 在Django窗体上引发ValidationError时出现问题

Python 在Django窗体上引发ValidationError时出现问题,python,django,django-forms,cleaned-data,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 = se

我试图验证提交的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
问题是,无论我提交什么值,我都无法提出
ValidationError
。如果我在
clean\u url()
方法中执行类似操作:

if Site.objects.get(domain=url):
    raise forms.ValidationError("That URL is already in the database.  Please submit a unique URL.")

然后我得到一个
DoesNotExist
错误,即使对于数据库中已经存在的URL也是如此。有什么想法吗?

我是这样做的。它稍微简单一点

try:
    a = Site.objects.get(domain=url)
    raise forms.ValidationError("That URL is already in the database.  Please submit a unique URL.")
except Site.DoesNotExist:
    pass
return url
我认为,您可以返回“”并填充错误

msg = u"That URL is already in the database.  Please submit a unique URL."
self._errors["url"]=ErrorList([msg])
return ''


IRC的django频道把我救在这里。问题是URLField.clean()做了两件我没有预料到的事情:

  • 如果不存在URL方案(例如http://),则该方法会在URL前面加上“http://”
  • 该方法还附加一个尾部斜杠
  • 结果将返回并存储在表单的数据中。所以我检查了
    cleaned_data['url']
    期望得到类似
    example.com
    的东西,并且实际得到了
    http://example.com/
    。可以这么说,将我的
    clean\u 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')
    

    我之所以登录,是因为我通过谷歌发现了类似的问题,并想在Carl Meyers的帖子中添加一条评论,指出根据Django文档,使用self.\u错误是完全有效的:


    那么,您还有其他问题。这必须奏效。您是否正在运行“manage.py testserver”,并且每次运行时都会得到一个新的空数据库?您正在运行“manage.py runserver”吗?同意。您的其他验证方法很有可能是“造成悲伤”。解决了问题-URLField.clean()在已清理的\u数据中放入的值与我预期的不同。答案如下。-1:引发ValidationError是正确的方法。手动填充self.\u错误是一种没有充分理由的黑客行为。
    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')