Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django:使用Django表单创建HTML输入数组_Python_Django_Django Forms - Fatal编程技术网

Python Django:使用Django表单创建HTML输入数组

Python Django:使用Django表单创建HTML输入数组,python,django,django-forms,Python,Django,Django Forms,我正在尝试自动创建如下内容: <input type='text' name='asdf[]' /> <input type='text' name='asdf[]' /> <input type='text' name='asdf[]' /> {% for input in form.fields.asdf %} {{input}} {% endfor %} 这样我就有希望得到上面显示的原始输入列表…它应该更像,例如: # in a model clas

我正在尝试自动创建如下内容:

<input type='text' name='asdf[]' />
<input type='text' name='asdf[]' />
<input type='text' name='asdf[]' />
{% for input in form.fields.asdf %}
{{input}}
{% endfor %}

这样我就有希望得到上面显示的原始输入列表…

它应该更像,例如:

# in a model class
for i in range(1, prim+1):
    self.fields['asdf_%s' % i] = forms.CharField(label='Label %i' % i)
但是这完全取决于你想要实现什么。

雅各布·卡普兰·莫斯(Django的合著者)最近发表了一篇关于处理动态表单的伟大文章,这篇文章应该以一种更好的方式解决你的问题:

他使用的方法与Felix建议的方法相同,但为了更好地理解这个概念,阅读整篇文章是值得的

使用
asdf[]
技术是草率的,因为这样您就必须处理订购问题。这也不是标准做法

编辑:

要处理在点击这些动态字段时需要检测的情况,请执行以下操作:

{% for input in form.fields %}
    {% ifequal input.label 'asdf' %}
        {{ forloop.counter }}: {{input}}<br />
    {% endifequal %}
{% endfor %}
{%用于form.fields%}
{%ifequal input.label'asdf%}
{{forloop.counter}}:{{input}}
{%endifequal%} {%endfor%}
看起来我可以通过将表单拆分为多个表单集来完成我需要做的事情


然后,我应该能够从模板中单独访问每个表单集,将它们包装成一个

<input type='text' name='asdf[]' />
<input type='text' name='asdf[]' />
<input type='text' name='asdf[]' />
{% for input in form.fields.asdf %}
{{input}}
{% endfor %}
表单_view.html


{{form}}
视图.py

#一些表单控制器
类DynamicFormView(FormView):
form_class=动态形式
template\u name=“form\u view.html”
def get_form_kwargs(自我):
kwargs=super(DynamicFormView,self)
#确定若干动态字段
#形成
#即形式(产品数量=5)
kwargs['num_products']=5
返回kwargs
型号.py

#模型
公司类别(型号.型号):
name=models.CharField(最大长度=200)
#与另一个模型具有多对一关系的模型
类别产品(型号.型号):
company=models.ForeignKey(company,on_delete=models.CASCADE)
name=models.CharField(最大长度=200)
forms.py

类动态表单(forms.ModelForm):
产品标签='产品名称'
类元:
model=MyModel
字段=['name']
定义初始化(self,*args,**kwargs):
#获取要创建的动态字段的数量
num_products=kwargs.pop('num_products')
#在创建字段之前初始化表单
超级(动态表单,自我)。\uuuuu初始化(*args,**kwargs)
#创建动态字段
对于范围内的行(num_产品):
self.fields['product.'.format(row)]=forms.CharField(label=self.question.\u label)
def save(self,commit=True):
#创建默认对象
company=super(DynamicForm,self).保存(commit)
#从动态字段创建子产品
产品=[]
对于键,self.cleaned_data.items()中的值:
如果key.startswith('product_'):
产品=产品()
product.name=值
product.company=公司
products.append(产品)
如果commit为True:
Product.objects.filter(company=company).delete()
产品.对象.批量创建(产品)
退货公司

您的循环正在创建一个带有无效标签(不能是整数)的新CharField,并覆盖self.field['asdf']。我不知道你想做什么。你的意思是喜欢使用choices属性吗?是的,它的特定版本只是覆盖了。我以前有更复杂的代码,试图创建列表和/或字典,但我也无法让它们工作。也许你可以制作标签“asdf”或其他东西,然后循环所有字段,如果
{%ifequal field.label“asdf”%}
匹配,则输出它,然后使用
forloop.counter
显示1、2、3,等等。我更新了下面的答案。我不希望字段在输出时有不同的名称。您不希望有不同的字段名称的特殊原因吗?很好奇。@Brant:很明显,字典中一个键不能包含多个值。在您的代码中,您只是一次又一次地重写该字段。是的,它是一个包含嵌套列表或其他内容的更复杂的字典。不管怎样,它都不起作用。这就是我最初的设置方式。不幸的是,它不能完全满足我的需要。在asdf[]输入开始之前,我需要插入一段描述文本。。。asdf[]输入的数量需要是动态的。因此,我需要能够检测到asdf输入即将开始,显示一个段落,然后将它们全部吐出来。好书。