Django ModelChoiceField: фильтрация набора запросов и установка значения по умолчанию в качестве объекта
у меня есть класс формы Django, определенный как это в Models:
class AccountDetailsForm(forms.Form):
...
adminuser = forms.ModelChoiceField(queryset=User.objects.all())
это работает нормально, но у него есть некоторые ограничения, которые я не могу обойти:
(1) я хотел бы использовать фильтр на queryset, основанный на переменной accountid перешел к форме, вот так:
User.objects.filter(account=accountid)
это не может работать в модели, потому что accountid не может быть передан как переменная, конечно.
следует, что queryset должны каким-то образом быть определены в Views, но насколько я вижу, это обязательное поле в классе формы.
(2) я хотел бы сделать выбор по умолчанию AccountDetailsForm объект в базе данных, который я могу выбрать в Views такой:
User.objects.filter(account=accountid).filter(primary_user=1)
Я попытался указать adminuser в качестве значения по умолчанию в форме (который работает с другими стандартными полями формы, например 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})
но не повезло.
Я должен использовать что-то другое, чем ModelChoiceField дали гибкость мне нужна здесь?
спасибо.
3 ответов:
переопределите метод init и примите новый аргумент ключевого слова
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)вы всегда можете просто установить параметры устанавливаются вручную в виде.
form = AccountDetailsForm() form.fields['adminuser'].queryset = User.objects.filter(account=accountid)
будьте осторожны: вы не установка значений по умолчанию путем передачи словаря в форму, как в вашем примере.
вы на самом деле создаете связанную форму, потенциально вызывая проверку и весь этот джаз.
чтобы установить значения по умолчанию,использовать инициалы аргумент.
form = AccountDetailsForm(initial={'adminuser':'3'})
вы можете переопределить поле в виде
yourForm = AccountDetailsForm() yourForm.fields['accomodation'] = forms.ModelChoiceField(User.objects.filter(account=accountid).filter(primary_user=1))
в Django 2.0 вы можете передать объект (
Userв вашем случае) отviewдоformвот так (сначала вы должны получить obj из БД):form = AccountDetailsForm(initial={'adminuser': adminuser})это даст вам выбранный по умолчанию объект (ответы на ваш 2) вопрос)
Comments