I'm trying to validate that a submitted URL doesn't already exist in the database.
The relevant parts of the Form class look like this:
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
The problem is, regardless of what value I submit, I can't raise the ValidationError
. And if I do something like this in the clean_url()
method:
if Site.objects.get(domain=url):
raise forms.ValidationError("That URL is already in the database. Please submit a unique URL.")
then I get a DoesNotExist
error, even for URLs that already exist in the Database. Any ideas?
Best Solution
django channel in IRC saved me here. The problem was that the URLField.clean() does two things I wasn't expecting:
The results are returned and stored in the form's cleaned_data. So I was checking
cleaned_data['url']
expecting something likeexample.com
and actually gettinghttp://example.com/
. Suffice to say, changing myclean_url()
method to the following works: