Django ModelChoiceField:过滤查询集并将默认值设置为对象
我有一个像这样定义的Django Form类Models
:
class AccountDetailsForm(forms.Form): ...
adminuser = forms.ModelChoiceField(queryset=User.objects.all())
这项工作正常,但有一些限制,我似乎无法解决:
(1)我想基于accountid
传递给表单的变量在queryset上使用过滤器,如下所示:
User.objects.filter(account=accountid)
当然,这在模型中不起作用,因为accountid
不能将其作为变量传递。
因此,queryset
必须以某种方式在中定义必须Views
,但据我所知,它是Form类中的必填字段。
(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
在这里需要的灵活性以外,我还应该使用其他东西吗?
谢谢。
回答:
覆盖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)
警告:你不会通过将字典传递给示例中的形式来设置默认值。
你实际上是在创建绑定表,可能触发验证和所有爵士乐。
要设置默认值,请使用initials参数。
form = AccountDetailsForm(initial={'adminuser':'3'})
以上是 Django ModelChoiceField:过滤查询集并将默认值设置为对象 的全部内容, 来源链接: utcz.com/qa/422787.html