Instancia de Django ModelForm con conjunto de consultas personalizado para un campo específico
-
10-07-2019 - |
Pregunta
Tengo un modelo similar al siguiente:
class Bike(models.Model):
made_at = models.ForeignKey(Factory)
added_on = models.DateField(auto_add_now=True)
Todos los usuarios pueden trabajar en varias fábricas y, por lo tanto, sus perfiles de usuario tienen un ManyToManyField
para Factory
.
Ahora quiero construir un ModelForm
para Bike
pero quiero que la lista made_at
consista solo en las fábricas en las que trabaja el usuario actual . La idea es que los usuarios puedan agregar bicicletas que hayan ensamblado e ingresar en cuál de las fábricas se fabricó la bicicleta.
¿Cómo hago eso?
Solución
Su pregunta podría ser un engaño de este .
S. respuesta de Lott existe el ticket para resolver su problema. Él respondió:
ForeignKey está representada por django.forms.ModelChoiceField, que es un ChoiceField cuyas opciones son un QuerySet modelo. Consulte la referencia de ModelChoiceField.
Entonces, proporcione un QuerySet al atributo de conjunto de consultas del campo. Depende de cómo se construya su formulario. Si crea un formulario explícito, tendrá campos nombrados directamente.
form.rate.queryset = Rate.objects.filter (company_id = the_company.id)
Si toma el objeto ModelForm predeterminado,form.fields [" rate "]. Queryset = ...
Esto se hace explícitamente en la vista. No hackear.
Otros consejos
prueba algo como esto en la vista
form = BikeForm()
form.fields["made_at"].queryset = Factory.objects.filter(user__factory)
modifique el conjunto de consultas de Factory para que identifique la fábrica en la que trabaja el usuario.
Ahora, debes usar:
form.base_fields['alumno_item'].queryset = AlumnoItem.objects.prefetch_related(
'alumno',
'alumno__estudiante',
'alumno__estudiante__profile',
'item'
)