Cree un conjunto de consultas vacío de forma predeterminada en los campos de formulario de django


169

Tengo estos campos en forma:

city = forms.ModelChoiceField(label="city", queryset=MyCity.objects.all())
district = forms.ModelChoiceField(label="district", queryset=MyDistrict.objects.all())
area = forms.ModelChoiceField(label="area", queryset=MyArea.objects.all())

el distrito proviene de hacer clic en la ciudad y el área proviene de hacer clic en el área. Con queryset=MyDistrict.objects.all()y queryset=MyArea.objects.all()forma será muy pesado. ¿Cómo puedo hacer que los conjuntos de consultas estén vacíos de forma predeterminada?


mi edición sugerida mejora la publicación. En general, ninguna publicación debe terminar con "gracias". No es personal, amigo. meta.stackexchange.com/questions/17878/…
Telarian

Respuestas:


422

Puede tener un conjunto de consultas vacío haciendo esto:

MyModel.objects.none()

Aunque no sé cómo va a usar ese formulario, puede ponerlo como el conjunto de consultas de su campo para obtener lo que necesita ...

Puedes encontrar más información aquí


44
En el caso de uso, su conjunto de consultas cambia en su vista según los parámetros de URL. Luego, en su vista, configura el conjunto de consultas correcto de la siguiente manera: edit_form.fields ["asset"]. Queryset = Asset.objects.filter (location_id = location_id)
radtek

¿Qué pasa si no tengo un modelo, solo estoy haciendo uno values_list('something', flat=True)?
Boris

2

El comentario de @ radtek debería ser una respuesta, ya que es útil en escenarios similares pero con un enfoque diferente al de la respuesta aceptada.

Si su conjunto de consultas cambia con la url en su vista.

Estoy extendiendo la respuesta con el ejemplo que usé:

def my_view(request):
    ...
    form = YourForm(initial={'field1':value1, 'field2':value2})
    form.fields['field3'].queryset = YourModel.objects.filter('foo'=bar)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.