Django单视图使用两个QuerySet报错:TypeError异常求助
问题排查与修复
错误根源
报错TypeError: __init__() got an unexpected keyword argument 'queryset_paused'的直接原因是:Django表单集(FormSet)的初始化方法只接受名为queryset的参数,你自定义的queryset_paused不是合法参数。
在视图中处理暂停活动的部分,你错误地将筛选后的查询集以queryset_paused作为参数名传递给CampaignStatusFormSet,而表单集类无法识别这个参数。
修复代码
将视图中所有queryset_paused=queryset_paused的写法替换为queryset=queryset_paused,修改后的views.py代码如下:
def home_view(request): # 运行中的活动 queryset = Campaign.objects.filter(is_active=True, completion_percent__lt=100) if request.method == "POST": form_type = request.POST.get('id') if form_type == 'campaign_status': formset = CampaignStatusFormSet( request.POST, request.FILES, queryset=queryset, ) formset.save() else: formset = CampaignStatusFormSet(queryset=queryset) campaigns_and_forms = list(zip(queryset, formset)) # 暂停的活动 queryset_paused = Campaign.objects.filter(is_active=False, completion_percent__lt=100) if request.method == "POST": form_type = request.POST.get('id_paused') if form_type == 'campaign_status_paused': # 修正参数名为queryset formset_paused = CampaignStatusFormSet( request.POST, request.FILES, queryset=queryset_paused, ) formset_paused.save() else: # 修正参数名为queryset formset_paused = CampaignStatusFormSet(queryset=queryset_paused) campaigns_and_forms_paused = list(zip(queryset_paused, formset_paused)) context = { 'formset': formset, 'campaigns_and_forms': campaigns_and_forms, 'formset_paused': formset_paused, 'campaigns_and_forms_paused': campaigns_and_forms_paused, } return render(request, 'campaigns_in_progress.html', context)
额外优化提示
当前视图的POST处理逻辑存在重复判断的问题,建议合并POST分支,先区分表单类型再处理,让逻辑更清晰:
def home_view(request): # 预加载两个查询集 queryset = Campaign.objects.filter(is_active=True, completion_percent__lt=100) queryset_paused = Campaign.objects.filter(is_active=False, completion_percent__lt=100) # 初始化两个表单集 formset = CampaignStatusFormSet(queryset=queryset) formset_paused = CampaignStatusFormSet(queryset=queryset_paused) if request.method == "POST": # 判断是哪个表单提交的请求 if request.POST.get('id') == 'campaign_status': formset = CampaignStatusFormSet( request.POST, request.FILES, queryset=queryset, ) formset.save() elif request.POST.get('id_paused') == 'campaign_status_paused': formset_paused = CampaignStatusFormSet( request.POST, request.FILES, queryset=queryset_paused, ) formset_paused.save() campaigns_and_forms = list(zip(queryset, formset)) campaigns_and_forms_paused = list(zip(queryset_paused, formset_paused)) context = { 'formset': formset, 'campaigns_and_forms': campaigns_and_forms, 'formset_paused': formset_paused, 'campaigns_and_forms_paused': campaigns_and_forms_paused, } return render(request, 'campaigns_in_progress.html', context)
内容的提问来源于stack exchange,提问作者low_ratio
相关产品推荐
相关产品推荐

