2009-09-30 7 views
7

Ich habe was ich denke, sollte ein einfaches Problem sein. Ich habe ein Inline-Modell-Formularset, und ich möchte ein Auswahlfeld mit einem standardmäßig ausgewählten Wert des aktuell angemeldeten Benutzers versehen. In der Ansicht verwende ich die Authentifizierungs-Middleware von Django, so dass es für den Benutzer einfach ist, auf request.user zuzugreifen.Django: Wie werden Anfangswerte für ein Feld in einem Inline-Modell-Formularsatz festgelegt?

Was ich jedoch nicht herausfinden konnte, ist, wie dieser Benutzer als der standardmäßig ausgewählte Wert in einem Auswahlfeld (ModelChoiceField) mit einer Liste von Benutzern festgelegt wird. Kann mir jemand dabei helfen?

Antwort

4

Ich bin mir nicht sicher, wie das Formularsätze in inline zu handhaben, aber die folgende Vorgehensweise wird für den normalen Formen und ModelForms arbeiten:

Sie können dies nicht gesetzt als Teil der Modelldefinition, aber Sie können festlegen es während der Formularinitialisierung:

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

Nicht sicher, wie dies mit dem Inline-Formset funktionieren würde. Ich verwende inlineformset_factory, um mein Formularset zu erstellen und ihm die Formularklasse zu übergeben, keine Instanz. Also instanziiere ich ein Formularobjekt nirgendwo direkt und weiß nicht, wie ich diesen Konstruktorparameter übergeben würde. – Jeff

+0

Hmmm ... Ich glaube, ModelForms wird den 'Standard' Wert annehmen, oder? Und Standard-Formularfelder verwenden Initial, wie du es zeigst, aber soweit ich weiß, gibt es keinen Grund, super() darauf zu gehen. – monkut

+0

Das ist großartig! Ich suchte nach einer Möglichkeit, Daten aus dem Formular an die Ansicht zu senden, damit ich den Status senden kann, der mithilfe des Nachrichtenframeworks angezeigt wird. In dem Formular habe ich das ursprüngliche Schlüsselwort verwendet, und dann in der Ansicht habe ich dies auf validate: cur_key_status = form.cleaned_data ['key_status'] messages.success (Anfrage, cur_key_status) – radtek

4

Das macht den Trick. Es funktioniert, indem die Anfangswerte aller "Extra" -Formulare festgelegt werden.

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

I Rune Kaagaard Idee oben bin mit, außer ich bemerkt, dass Formularsätze bieten eine extra_forms Eigenschaft: 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():] 

Also, mit dem Beispiel kleben oben:

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

Saves Wenn Sie alle anfänglichen Formulare testen müssen, geben Sie einfach den Standard für zusätzliche Formulare an.

Verwandte Themen