You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 17:48:09