2008-12-04 5 views
5

Я пытаюсь проверить, что представленный URL-адрес еще не существует в базе данных.Проблемы с повышением ValidationError в форме Django

Соответствующие части формы класса выглядят следующим образом:

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

Джанго канал в IRC спас меня здесь. Проблема заключалась в том, что URLField.clean() делает две вещи, которые я не ожидал:

  1. Если нет схемы URL не присутствует (например, HTTP: //) метод подставляет «HTTP: //» в url
  2. метод также добавляет конечную косую черту.

Результаты возвращаются и хранятся в очищенных_файлах формы. Поэтому я проверял 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 runningerver»? – 2008-12-04 11:11:50

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 
0

Ну я вошел в причине я нашел через Google с подобным вопросом и хотел бы добавить комментарий к Carl Meyers сообщению отметить, что использование self._errors не полностью действует в соответствии с Документами Джанго:

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

 Смежные вопросы

  • Нет связанных вопросов^_^