2008-12-04 59 views
5

我想验证提交的URL在数据库中不存在。在Django表单上产生ValidationError的问题

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

Django的通道在这里救了我。问题是,URLField.clean()做两件事情我没想到:

  1. 如果没有URL方案存在(比如http://)的方法预规划的“http://”的url
  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') 
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 
+0

没有好 - 的错误不会引起人们的关注,当它应该。 – saturdayplace 2008-12-04 04:04:08

+0

那么你还有其他问题。这必须工作。你运行的是“manage.py testserver”,每次运行时都会得到一个新的空数据库?你正在运行“manage.py runserver”吗? – 2008-12-04 11:11:50

0

我想,你可以返回''并填充_errors。在IRC

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