update tipos personalizados formularios form ejemplos crear avanzados python django django-forms cleaned-data

python - tipos - Problemas al generar un ValidationError en un formulario de Django



tipos de formularios en django (4)

Estoy tratando de validar que una URL enviada no existe en la base de datos.

Las partes relevantes de la clase Form se ven así:

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

El problema es que, independientemente del valor que envíe, no puedo generar el ValidationError . Y si hago algo como esto en el método clean_url() :

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

luego recibo un error de DoesNotExist , incluso para las URL que ya existen en la base de datos. ¿Algunas ideas?



Creo que puedes regresar y llenar los errores.

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

o

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


El canal django en IRC me salvó aquí. El problema fue que URLField.clean () hace dos cosas que no esperaba:

  1. Si no hay un esquema de URL presente (p. Ej., Http: //), el método antepone "http: //" a la URL.
  2. el método también agrega una barra inclinada.

Los resultados se devuelven y almacenan en clean_data del formulario. Así que estaba revisando cleaned_data[''url''] esperando algo como example.com y obteniendo realmente http://example.com/ . Baste decir, cambiando mi método clean_url() a los siguientes trabajos:

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'')


Lo hago de esta manera. Es un poco mas simple

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