2009-09-30 20 views
7

Tengo lo que creo que debería ser un problema simple. Tengo un formset de modelo en línea, y me gustaría hacer que un campo de selección tenga un valor seleccionado por defecto del usuario actualmente conectado. En la vista, estoy usando el middleware de Autenticación de Django, por lo que obtener al usuario es una simple cuestión de acceder al request.user.Django: ¿Cómo establecer los valores iniciales para un campo en un formset de modelo en línea?

Lo que no he sido capaz de averiguar, sin embargo, es cómo establecer ese usuario como el valor seleccionado por defecto en un cuadro de selección (ModelChoiceField) que contiene una lista de usuarios. Puede alguien ayudarme con esto?

Respuesta

4

no estoy seguro de cómo manejar esto en juegos de formularios en línea, pero el siguiente enfoque funcionará para las formas y ModelForms normales:

No se puede establecer esto como parte de la definición del modelo, pero se puede configurar que durante la inicialización del formulario:

def __init__(self, logged_in_user, *args, **kwargs): 
    super(self.__class__, self).__init__(*args, **kwargs) 
    self.fields['my_user_field'].initial = logged_in_user 

... 

form = MyForm(request.user) 
+0

No estoy seguro de cómo funcionaría esto con el formset en línea. Estoy usando inlineformset_factory para crear mi formset y pasarle la clase de formulario, no una instancia. Así que no estoy instanciando directamente un objeto de formulario en ninguna parte y no sé cómo lo pasaría ese parámetro de constructor. – Jeff

+0

Hmmm ... Creo que ModelForms tomará el valor 'predeterminado', ¿no? Y los campos de formulario estándar utilizan la inicial como se muestra, pero hasta donde sé, no hay ninguna razón para ir super() en él. – monkut

+0

Esto es genial! Estaba buscando una forma de enviar datos desde el formulario a la vista para que pueda enviar el estado que se mostrará utilizando el marco de mensajes. En la forma en que usé la palabra clave inicial, y luego en la vista lo hice al validar: cur_key_status = form.cleaned_data ['key_status'] messages.success (request, cur_key_status) – radtek

4

Esto hace el truco. Funciona al establecer los valores iniciales de todas las formas "extra".

formset = MyFormset(instance=myinstance) 
user = request.user 
for form in formset.forms: 
    if 'user' not in form.initial: 
     form.initial['user'] = user.pk 
0

estoy usando la idea de runa Kaagaard anterior, excepto Noté que formsets proporcionan una propiedad extra_forms: django.forms.formsets code

@property 
def extra_forms(self): 
    """Return a list of all the extra forms in this formset.""" 
    return self.forms[self.initial_form_count():] 

Por lo tanto, el de mantener el ejemplo anterior:

formset = MyFormset(instance=myinstance) 
user = request.user 
for form in formset.extra_forms: 
    form.initial['user'] = user.pk 

países al tener que probar cualquier forma inicial, simplemente proporcione valores predeterminados para formularios adicionales.

Cuestiones relacionadas