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?
Respuesta
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.
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
¿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')
Funciona perfectamente. – user240515
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
@drdaeman [Indeed] (https://code.djangoproject.com/ticket/20202) – valtron
- 1. Django: ModelChoiceField remove default --------- choice
- 2. Django, ModelChoiceField() y el valor inicial
- 3. Formularios Django: cómo crear dinámicamente etiquetas ModelChoiceField
- 4. Uso método distinto __unicode__ en ModelChoiceField Django
- 5. Python: ¿Por qué usar algo que no sea uuid4() para cadenas únicas?
- 6. ¿Puedo desarrollar para Android en algo que no sea Java?
- 7. formularios ModelChoiceField queryset + campos de elección extra django forms
- 8. Lo que hace que algo sea iterable en python
- 9. javascript, espera a que algo sea cierto, ejecuta la acción
- 10. ¿Es posible que class.property = x devuelva algo que no sea x?
- 11. Regex para que coincida con algo que no sea una subcadena específica
- 12. ¿Hay algo para Python que sea como readdability.js?
- 13. Frasco: api de descanso anidado: ¿usar algo que no sea methodview o he hecho un diseño incorrecto?
- 14. ¿MutationRecord.oldValue es algo que debería usar?
- 15. ¿Se puede usar Django para aplicaciones que no sean web?
- 16. algo similar a python-DJANGO en PHP?
- 17. Cómo grabar algo que no sea PCM lineal en el iPhone
- 18. Regex: ¿cómo decir algo que NO coincida?
- 19. ¿Cuándo se invocará javax.servlet.Filter.doFilter (ServletRequest req, ServletResponse res) con algo que no sea HttpServletRequest/Response?
- 20. Obtener el iterador de la lista de Java para devolver algo que no sea el Objeto
- 21. Se devolvió algo que no sea int en el método JSNI
- 22. ¿Implementando una interfaz directa en emacs para algo que no sea el sistema de archivos?
- 23. ¿Cómo agrego algo al .gitignore para que la coincidencia no sea recursiva?
- 24. gwt algo que no sea int se devolvió desde el método jsni
- 25. ¿Cómo hacer que DateTimeField de Django sea opcional?
- 26. ¿Algo mejor que P6Spy?
- 27. Django SELECT ID máx
- 28. ¿Es posible hacer referencia a una columna que no sea 'id' para JoinColumn?
- 29. Django: ¿cómo hacer que ImageField/FileField sea opcional?
- 30. ¿Cómo hacer que FileField en django sea opcional?
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