Django中如何向Form传递额外参数以获取正确的QuerySet
你贴的代码片段存在文件名标注错误:表单类AddAccountForm应归属forms.py,视图函数add_account应归属views.py,以下方案基于修正后的文件结构给出。
实现步骤
1. 修改表单类,重写初始化方法接收user参数
在forms.py中重写AddAccountForm的__init__方法,先提取自定义传入的user参数,再动态设置company字段的查询集:
# forms.py from django import forms from .models import Company class AddAccountForm(forms.Form): # 初始化先给空查询集,后续动态覆盖 company = forms.ModelChoiceField(queryset=Company.objects.none()) # 其余原有字段... def __init__(self, *args, **kwargs): # 先把自定义参数user从kwargs中取出,避免传给父类初始化方法报错 self.user = kwargs.pop('user', None) super().__init__(*args, **kwargs) # 用拿到的user生成符合要求的查询集 if self.user: self.fields['company'].queryset = Company.objects.filter( cashpool__name=self.user.company.cashpool )
2. 视图中实例化表单时传入user参数
GET和POST场景都需要传入user参数,否则POST校验时会因为使用初始空查询集触发「选项无效」的报错:
# views.py from .forms import AddAccountForm def add_account(request): # GET请求场景 if request.method == 'GET': form = AddAccountForm(user=request.user) # POST请求场景 elif request.method == 'POST': form = AddAccountForm(request.POST, user=request.user) if form.is_valid(): # 原有业务逻辑 ... # 其余原有逻辑...
注意事项
ModelChoiceField的queryset参数要求接收QuerySet对象,不要使用get方法(返回单个模型实例),要用filter方法生成查询集- 如果使用类视图,逻辑完全一致,只要在实例化表单时把
request.user作为user参数传入即可
内容的提问来源于stack exchange,提问作者JSRB
相关产品推荐
相关产品推荐

