2009-09-30 21 views
7

Ho quello che penso dovrebbe essere un problema semplice. Dispongo di un formset di modelli in linea e mi piacerebbe che un campo di selezione avesse un valore predefinito predefinito dell'utente attualmente connesso. Nella vista, sto usando il middleware di autenticazione di Django, quindi ottenere l'utente è una semplice questione di accesso a request.user.Django: come impostare i valori iniziali per un campo in un formset del modello in linea?

Ciò che non sono stato in grado di capire, tuttavia, è come impostare quell'utente come valore predefinito selezionato in una casella di selezione (ModelChoiceField) contenente un elenco di utenti. Qualcuno mi può aiutare con questo?

risposta

4

non sono sicuro di come gestire questo in formsets in linea, ma il seguente approccio lavorerà per forme normali e ModelForms:

Non è possibile impostare questo come parte della definizione del modello, ma è possibile impostare durante l'inizializzazione del modulo:

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

Non so come questo potrebbe funzionare con il formset in linea. Sto usando inlineformset_factory per creare il mio formset e passarlo nella classe form, non in un'istanza. Quindi non sto istanziando direttamente un oggetto modulo da nessuna parte e non so come passarei il parametro costruttore. – Jeff

+0

Hmmm ... Credo che ModelForms assumerà il valore 'predefinito', vero? E i campi dei moduli standard usano inizialmente come si mostra, ma per quanto ne so non c'è motivo per cui andare super() su di esso. – monkut

+0

Questo è fantastico! Stavo cercando un modo per inviare dati dal modulo alla vista in modo da poter inviare lo stato che verrà visualizzato utilizzando il framework dei messaggi. Nel modulo ho usato la parola chiave iniziale, quindi nella vista l'ho fatto per convalidare: cur_key_status = form.cleaned_data ['key_status'] messages.success (request, cur_key_status) – radtek

4

Questo è il trucco. Funziona impostando i valori iniziali di tutte le forme "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

sto usando idea di Rune Kaagaard sopra, tranne ho notato che formsets forniscono una proprietà 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():] 

Quindi, attaccare con l'esempio precedente:

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

Più Siti dovendo testare qualsiasi modulo iniziale, basta fornire di default moduli aggiuntivi.

Problemi correlati