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

Django动态向表单添加Integer字段问题求助

解决方案

问题出在你直接在类定义里循环赋值变量name,每次循环都会覆盖之前的变量,最终类里只会保留最后一次赋值的字段。Django表单的字段需要添加到self.fields字典中(这是表单存储字段的核心容器),且要在表单的__init__方法里处理动态字段——类定义阶段的代码只会执行一次,无法正确生成多个独立字段。

修正后的代码如下:

from django import forms
from .models import Products

class Batch(forms.Form):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        # 实例化表单时再查询数据库,避免类加载阶段过早执行查询操作
        bases = Products.objects.all().values_list('product_name', 'id')
        for product_name, product_id in bases:
            # 用结合product_id的唯一字符串作为字段名,避免键冲突
            field_name = f"product_{product_id}"
            # 创建字段并添加到表单的字段容器中
            self.fields[field_name] = forms.IntegerField(
                label=product_name,
                widget=forms.NumberInput(attrs={"id": product_id})
            )

关键说明

  • 移至__init__方法:表单实例化时才执行数据库查询和字段添加,既保证每次实例化都能获取最新数据,也避免了类加载阶段的不必要操作。
  • 唯一字段名:用product_{product_id}作为字段名,确保每个字段在self.fields字典中有唯一的键,不会被覆盖。
  • 添加到self.fields:Django表单通过self.fields管理所有字段,只有将字段存入这个字典,才能真正实现多字段的添加与渲染。

调整后生成的表单会对应数据库里的每一行产品,每个输入框的标签为产品名称,id为产品的id,后续用jQuery可通过$('#{product_id}')直接获取对应字段的值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 01:26:01