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?
Bueno, me conecté porque encontré esto a través de Google con un problema similar y quería agregar un comentario a la publicación de Carl Meyers, señalando que el uso de self._errors es totalmente válido según los documentos de Django:
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:
- Si no hay un esquema de URL presente (p. Ej., Http: //), el método antepone "http: //" a la URL.
- 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