您好,我正在制作一个非常简单的应用程序来学习 Django。
我有一个 SQLite 表,有两列,第一列是 Django 生成的“
id
”,第二个是包含 product_name
名称的 charfield。
我尝试让程序运行的方式如下:
bases
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],它将打印该列中的所有条目。这与我如何将字段添加到表单有关。
非常感谢任何解决这个小问题的帮助。
您可以在表单的
__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})
)
这将为数据库中的每个产品创建一个字段。每个字段都会根据循环添加到表单中,因此您可以创建与数据库中的行一样多的输入字段。