Django 动态向表单添加整数字段

问题描述 投票:0回答:1

您好,我正在制作一个非常简单的应用程序来学习 Django。

我有一个 SQLite 表,有两列,第一列是 Django 生成的“

id
”,第二个是包含
product_name
名称的 charfield。

我尝试让程序运行的方式如下:

  1. 获取表中值的值列表。该 query_set 被分配给
    bases
  2. 循环遍历
    bases
    列表中的每个元组,并使用这些值创建表单字段。因此
    product_name
    将是标签,
    id
    将是字段的 id。稍后我将在这些字段上使用 Jquery 来获取值。

我有以下代码:

from django import forms
from django.db import models
from django.core.exceptions import ValidationError

from .models import Department, Test_list, Products, Current_tests

class Batch(forms.Form):
    bases = Products.objects.all().values_list('product_name','id')
    
    for i in bases: 
        for j in [0,1]:
            bn = i[0]
            bnid = i[1]
            name = forms.IntegerField(label=f"{bn}",widget=forms.NumberInput(attrs={"id":bnid}))

该代码实际上有效,但它并没有获得与数据库中的行数相等的文本输入数量,而是仅显示最后一行。我相信这是因为在循环中,我只是简单地重新分配一个不同的值

"name"
。循环本身有效,如果我打印 i[0],它将打印该列中的所有条目。这与我如何将字段添加到表单有关。

非常感谢任何解决这个小问题的帮助。

python-3.x django django-forms
1个回答
0
投票

您可以在表单的

__init__
方法中执行此操作。

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:
            self.fields[str(product_id)] = forms.IntegerField(
                label=product_name,
                widget=forms.NumberInput(attrs={"id": product_id})
            )

这将为数据库中的每个产品创建一个字段。每个字段都会根据循环添加到表单中,因此您可以创建与数据库中的行一样多的输入字段。

© www.soinside.com 2019 - 2024. All rights reserved.