2009-09-30 5 views
7

Mam to, co moim zdaniem powinno być prostym problemem. Mam formułę wbudowanego modelu i chciałbym, aby pole wyboru miało domyślną wybraną wartość aktualnie zalogowanego użytkownika. W widoku używam oprogramowania pośredniczącego do uwierzytelniania Django, więc uzyskanie użytkownika jest prostą sprawą uzyskania dostępu do request.user.Django: Jak ustawić wartości początkowe dla pola w formularzu modelu wbudowanego?

Jednak nie byłem w stanie wymyślić, jak ustawić tego użytkownika jako domyślną wybraną wartość w polu wyboru (ModelChoiceField) zawierającym listę użytkowników. Czy ktoś może mi w tym pomóc?

Odpowiedz

4

Nie jestem pewien, w jaki sposób sobie z tym poradzić w formsets inline, ale następujące podejście będzie działać na normalnych form i ModelForms:

nie można ustawić to jako część definicji modelu, ale można ustawić podczas inicjowania formularza:

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

Nie wiem, jak to by działało z wbudowanym formularzem. Używam inlineformset_factory do tworzenia mojego zestawu formularzy i przekazywania go klasy formularza, a nie instancji. Więc nie jestem bezpośrednio tworzenie obiektu formularza w dowolnym miejscu i nie wiem, jak przekazać go tego parametru konstruktora. – Jeff

+0

Hmmm ... Wierzę, że ModelForms przyjmie "domyślną" wartość, prawda? Standardowe pola formularzy używają początkowego, jak widać, ale o ile wiem, nie ma powodu, aby przejść do niego super(). – monkut

+0

To jest świetne! Szukałem sposobu na przesłanie danych z formularza do widoku, aby można było wysyłać stan, który będzie wyświetlany przy użyciu struktury komunikatów. W formularzu użyłem początkowego słowa kluczowego, a następnie w widoku zrobiłem to podczas sprawdzania poprawności: cur_key_status = form.cleaned_data ['key_status'] messages.success (request, cur_key_status) – radtek

4

To działa. Działa poprzez ustawienie wartości początkowych wszystkich "dodatkowych" formularzy.

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

używam pojęcia Rune Kaagaard za wyżej, z wyjątkiem zauważyłem, że formsets stanowią własność 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():] 

więc trzymać z powyższego przykładu:

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

Zapisuje konieczności przetestowania formularzy początkowych, wystarczy podać domyślne dla dodatkowych formularzy.