Django ModelChoiceField:过滤查询集并将默认值设置为对象

我有一个Django Form类定义喜欢这在Models

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

这工作正常,但它有一些限制,我似乎无法解决:

(1)我想对查询集使用一个filter,基于一个variablesaccountid传递给窗体,如下所示:

 User.objects.filter(account=accountid) 

这在模型中不起作用,因为accountid当然不能作为variables传递。

因此,查询集必须以某种方式在Views定义,但据我所知,它是Form类中的必需字段。

(2)我想使AccountDetailsForm的默认select在数据库中的一个对象,我可以在这样的Viewsselect:

 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以外的其他function吗?

谢谢。

覆盖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) 

被警告:你不是通过传递一个字典到像你的例子一样的forms来设置默认值。

你实际上正在创build一个绑定表单,可能触发validation和所有的爵士乐。

要设置默认值,请使用initials参数。

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

您可以覆盖视图中的字段

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