2012-03-22 13 views
8

Supongo que tengo una tabla address y tiene un campo postal_code - ModelChoiceField no me permite usar algo más que PK para validar la existencia correcta? ¿Cuál sería el camino a seguir? Entrada normal y uso clean_*()?Django ModelChoiceField: ¿usar algo que no sea id?

+0

depende de cómo la nave de la relación se establece, por su con el '' modelo de primary_key' postal_code' defecto. ¿Puede dar más detalles como su 'dirección' y los modelos relacionados' postal_code'. Un 'ModelChoiceField' de forma predeterminada crea un menú desplegable con opciones como instancias existentes del modelo relacionado. – Pannu

Respuesta

0

ModelChoiceFields se utilizan para seleccionar entre una selección de instancias de modelo existentes. Esto casi siempre está mejor representado por algún tipo de campo Seleccionar.

Dicho esto, realmente tiene un FK de la dirección postal_code como está implicando. ¿Qué almacena en una tabla PostalCode para justificar la tabla adicional que deberá unirse para cada consulta relacionada con la dirección?

En la mayoría de los casos postal_code debe ser simplemente un CharField y en ese caso si desea validar que el valor es válido puede usar el atributo 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 realmente el código postal como la clave principal en lugar del autoincrement predeterminado, ya que es necesariamente único, hace sus datos son más exportables, y resuelve su problema con validación.

1

Si postal_code es una clave externa para un modelo PostalCode que contiene códigos postales válidos, solo usaría un CharField y luego haría una limpieza como la que sugirió. Mi método de limpieza sería este:

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 
20

¿Qué hay de to_field_name? No estoy seguro si está documentado en cualquier lugar, pero puede encontrarlo fácilmente entre ModelChoiceField parámetros de constructor: 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') 
+0

Funciona perfectamente. – user240515

+2

Tenga cuidado, en 1.4 (aún no lo intenté con 1.5, lo siento) está roto cuando se usa con el argumento 'instance', ya que' model_to_dict' utiliza forzosamente PK (en realidad, 'value_for_object'). Para solucionarlo uno tiene que hacer 'YourForm (..., instance = foo, initial = {" bar ": foo.bar.slug})'. Ver la implementación 'BaseModelForm .__ init__' para más detalles. – drdaeman

+1

@drdaeman [Indeed] (https://code.djangoproject.com/ticket/20202) – valtron

Cuestiones relacionadas