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在数据库中的一个对象,我可以在这样的Views
select:
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))