在Django表单上引发ValidationError的问题

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也是如此.有任何想法吗?

sat*_*ace 4

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

  1. 如果不存在 URL 方案(例如,http://),则该方法会在 url 前面添加“http://”
  2. 该方法还附加一个尾部斜杠。

结果被返回并存储在表单的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)