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

Django动态表单无法正确处理布尔输入问题求助

Django动态表单BooleanField值无法正确获取问题解决

问题场景

我动态构建了一个小型表单:

class AddonForm(Form):

    def __init__(self, addons, *args, **kwargs):
        super().__init__(self, *args, **kwargs)
        self.addons = {str(addon.pk): addon for addon in addons}
        for pk, addon in self.addons.items():
            self.fields[str(pk)] = BooleanField(required=False, label=f"{addon} (x{addon.price_multiplier})")

表单使用方式如下:

form = AddonForm(ItemAddonTemplate.objects.filter(item=item_template_id), request.POST)
if form.is_valid():
    addons = form.cleaned_data

请求POST数据显示3和32字段值为on:

<QueryDict: {'csrfmiddlewaretoken': ['cJS1fhGY3WqIflynGbZIh9TiRj8F9HjgoLOUL6TwWY4j4cotALGHpFDyQwjLiLMW'], '3': ['on'], '32': ['on']}>

但打印form.cleaned_data时,所有字段都返回False:

{'3': False, '30': False, '31': False, '32': False, '33': False, '34': False}

当前环境:Django 5.1、Python 3.12。


问题原因

错误出在__init__方法的父类构造调用上——你额外传递了self参数给super().__init__。Python类继承中,调用父类构造方法时不需要手动传入self,这个参数会自动绑定,多余的self会导致表单初始化异常,无法正确解析POST数据里的on标记。


解决方案

修改__init__方法中的super调用,移除多余的self参数:

class AddonForm(Form):

    def __init__(self, addons, *args, **kwargs):
        super().__init__(*args, **kwargs)  # 移除第一个self参数
        self.addons = {str(addon.pk): addon for addon in addons}
        for pk, addon in self.addons.items():
            self.fields[str(pk)] = BooleanField(required=False, label=f"{addon} (x{addon.price_multiplier})")

修正后,表单会正确识别POST数据中的on值,对应字段在cleaned_data里会返回True。

内容的提问来源于stack exchange,提问作者gruszczy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 16:41:07