Django ModelChoiceField:过滤查询集并将默认值设置为对象
我有一个Django Form类定义喜欢这个在Models:
class AccountDetailsForm(forms.Form):
...
adminuser = forms.ModelChoiceField(queryset=User.objects.all())
这工作正常,但它有一些限制,我似乎不能解决:
(1)我想在查询集上使用一个过滤器,基于传递给表单的变量accountid,如下所示:
User.objects.filter(account=accountid)
这不能在模型中工作,因为accountid不能作为一个变量传递,当然。
因此,查询集必须以某种方式在视图中定义,但就我可以看到它是一个必需的字段在Form类。
(2)我想默认选择AccountDetailsForm数据库中的一个对象,我可以在视图中选择这样:
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之外的其他方式给我这里需要的灵活性吗?
谢谢。
覆盖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)
警告:您不是通过将字典传递到您的示例中的表单来设置默认值。
你实际上创建了一个绑定表,可能触发验证和所有的爵士。
要设置默认值,use the initials argument.
form = AccountDetailsForm(initial={'adminuser':'3'})
翻译自:https://stackoverflow.com/questions/5329586/django-modelchoicefield-filtering-query-set-and-setting-default-value-as-an-obj