widgets tipos personalizados formularios form example ejemplos avanzados django django-forms

tipos - submit django form



Django ModelChoiceField: conjunto de consultas de filtrado y configuraciĆ³n del valor predeterminado como un objeto (3)

Anula el método init y acepta un nuevo argumento de palabra clave

class AccountDetailsForm(forms.Form): ... adminuser = forms.ModelChoiceField(queryset=User.objects.all()) def __init__(self, *args, **kwargs): accountid = kwargs.pop(''accountid'', None) super(AccountDetailsForm, self).__init__(*args, **kwargs) if accountid: self.fields[''adminuser''].queryset = User.objects.filter(account=accountid) form = AccountDetailsForm(accountid=3)

Siempre puede establecer las opciones manualmente en la vista también.

form = AccountDetailsForm() form.fields[''adminuser''].queryset = User.objects.filter(account=accountid)

Tenga cuidado: no está configurando valores predeterminados al pasar en un diccionario a un formulario como en su ejemplo.

En realidad, estás creando un Bound Form, lo que podría desencadenar la validación y todo ese jazz.

Para establecer los valores predeterminados, use el argumento de las iniciales.

form = AccountDetailsForm(initial={''adminuser'':''3''})

Tengo una clase de formulario Django definida como Me gusta en Models :

class AccountDetailsForm(forms.Form): ... adminuser = forms.ModelChoiceField(queryset=User.objects.all())

Esto funciona bien, pero tiene algunas limitaciones que parece que no funciona:

(1) Me gustaría usar un filtro en el conjunto de preguntas, basado en una variable que se pasó al formulario, como esta:

User.objects.filter(account=accountid)

Esto no puede funcionar en el modelo porque, por supuesto, accountid no se puede pasar como una variable.

Se deduce que el conjunto de queryset debe queryset alguna manera en las Views , pero, por lo que puedo ver, es un campo obligatorio en la clase Form.

(2) Me gustaría hacer la opción predeterminada de AccountDetailsForm un objeto en la base de datos, que puedo seleccionar en las Views esta manera:

User.objects.filter(account=accountid).filter(primary_user=1)

Intenté especificar adminuser como valor predeterminado en el formulario (que funciona con otros campos de formulario estándar, como CharField ):

adminuser = User.objects.filter(account=accountid).filter(primary_user=1) ... form = AccountDetailsForm({''adminuser'': adminuser}) return render_to_response(''accounts/edit/accountdetails.html'', {''form'': form, ''account'':account})

Pero sin suerte.

¿Debería usar algo que no sea ModelChoiceField dada la flexibilidad que necesito aquí?

Gracias.


En Django 2.0 puede pasar el objeto ( User en su caso) de la view al form esta manera (primero debe recuperar Obj del DB):

form = AccountDetailsForm(initial={''adminuser'': adminuser})

Le dará un objeto seleccionado por defecto (respuestas a su pregunta 2)


Puede anular el campo en la vista

yourForm = AccountDetailsForm() yourForm.fields[''accomodation''] = forms.ModelChoiceField(User.objects.filter(account=accountid).filter(primary_user=1))