2011-03-16 4 views
48

Mam klasy zdefiniowane Django Form lubi to w Models:Django ModelChoiceField: filtrowanie zapytanie i ustawień domyślną wartość jako przedmiot

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

To działa OK, ale ma pewne ograniczenia, nie wydaje się obejść:

(1) Chciałbym użyć filtru na queryset, opartego na zmiennej accountid przeszedł do formy, na przykład:

User.objects.filter(account=accountid) 

To nie działa w modelu, ponieważ accountid nie można oczywiście przekazać jako zmiennej.

Wynika z tego, że queryset musi być w jakiś sposób zdefiniowany w Views, ale o ile widzę, jest to wymagane pole w klasie Form.

(2) Chciałbym dokonać wyboru domyślnej AccountDetailsForm obiekt w bazie danych, które można wybrać w Views jak ten:

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

Próbowałem określając adminuser jako domyślny wartość w postaci, (która współpracuje z innymi standardowymi pól formularza, jak 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}) 

Ale bez powodzenia.

Czy powinienem używać czegoś innego niż ModelChoiceField ze względu na elastyczność, której tutaj potrzebuję?

Dzięki.

Odpowiedz

91

zastąpić metodę startowych i przyjąć nową kluczowego argumentu

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) 

Zawsze można po prostu ustawić opcje ręcznie w widoku, jak również.

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

Ostrzegamy: nie jesteś wartości domyślne ustawienie, przechodząc w słowniku do postaci jak w przykładzie.

Tworzysz formularz związany, potencjalnie wyzwalający sprawdzanie poprawności i cały ten jazz.

Aby ustawić domyślne, use the initials argument.

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

Witam, dzięki za odpowiedź. Ustawienie zestawu zapytań w widoku działało dobrze. Częścią, której nie mogłem wypracować, jest ustawienie powiązanej wartości formularza (zamiast domyślnej) ModelChoiceField jako _User.objects.filter (account = accountid) .filter (primary_user = 1) _. Dzięki. – eli

6

Można zmienić pole w widoku

yourForm = AccountDetailsForm() 

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