5

我正在尝试验证数据库中不存在提交的 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_url()

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

然后我得到一个DoesNotExist错误,即使是数据库中已经存在的 URL。有任何想法吗?

4

4 回答 4

4

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

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

结果被返回并存储在表单的cleaned_data 中。所以我正在检查期待和实际得到的cleaned_data['url']东西。可以说,将我的方法更改为以下工作:example.comhttp://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')
于 2008-12-04T18:30:40.107 回答
1

我这样做。它稍微简单一些。

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
于 2008-12-04T02:38:01.963 回答
0

我认为,您可以返回 '' 并填写 _errors。

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

或者

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)
        raise forms.ValidationError("That URL is already in the database.  Please submit a unique URL.")
    except Site.DoesNotExist:
        return url
    return ''

def clean(self):
    # Other form cleaning stuff.  I don't *think* this is causing the grief
于 2008-12-04T10:31:07.063 回答
0

好吧,我登录了,因为我通过 Google 发现了类似的问题,并想在 Carl Meyers 帖子中添加评论,指出根据 Django 文档,使用 self._errors 是完全有效的:

http://docs.djangoproject.com/en/1.2/ref/forms/validation/#cleaning-and-validating-fields-that-depend-on-each-other

于 2010-11-15T15:20:10.850 回答