python - initial - Django ModelChoiceField: ¿utilizas algo que no sea id?
forms.select django (3)
ModelChoiceFields está destinado a ser utilizado para seleccionar entre una selección de instancias de modelos existentes. Esto casi siempre está mejor representado por algún tipo de campo Seleccionar.
Dicho eso, ¿realmente tienes un FK de dirección a postal_code como estás implicando? ¿Qué almacena en una tabla PostalCode para justificar la tabla adicional que deberá unirse para cada consulta relacionada con la dirección?
Para la mayoría de los casos, postal_code debería ser simplemente un CharField y en ese caso, si desea validar que el valor es válido, puede usar el atributo de choices
con una lista de códigos postales válidos. Tenga en cuenta que mantener una lista de códigos postales válidos a mano es una gran molestia.
Si realmente tiene una tabla PostalCode y cree que es una buena idea (que en algunos casos podría ser), puede considerar utilizar el código postal como la clave principal en lugar de la autoincrementación predeterminada, ya que es necesariamente única, hace que sus datos sean más exportables. y resuelve tu problema con la validación
Supongamos que tengo una tabla de address
y tiene un campo postal_code
- ModelChoiceField no me permite usar algo que no sea PK para validar la existencia correcta. ¿Cuál sería el camino a seguir? Entrada normal y uso clean_*()
?
Si postal_code
es una clave foránea para un modelo de PostalCode que contiene códigos postales válidos, solo usaré un CharField y luego haré una limpieza como sugirió. Mi método de limpieza se vería así:
def clean_postal_code(self):
try:
code = PostalCode.objects.get(code_field=self.data[''postal_code''])
except:
raise forms.ValidationError("Please enter a valid postal code")
return code
¿Qué pasa con to_field_name
? No estoy seguro si está documentado en cualquier lugar, pero puede encontrarlo fácilmente entre los ModelChoiceField
constructor de ModelChoiceField
: https://github.com/django/django/blob/master/django/forms/models.py . Se usa para filtrar el conjunto de preguntas de campo.
Por ejemplo:
articles = ModelChoiceField(queryset=Articles.objects.all(),
to_field_name=''slug'')