是否可以使用django表单创建可变数量的字段?
具体应用如下:
用户可以在图片上传表单上上传任意数量的图片。上传图片后,他们会被带到一个页面,在那里他们可以给图片命名和描述。图片数量取决于用户选择上传的数量。
所以如何让django使用可变数量的输入字段生成表单(如果需要可以作为参数传递)?
编辑:自article mentioned in jeff bauer's answer编写以来,有些事情发生了变化。
即这行代码似乎不起作用:
# BAD CODE DO NOT USE!!!
return type('ContactForm', [forms.BaseForm], { 'base_fields': fields })
所以这就是我想出的......
from tagging.forms import TagField
from django import forms
def make_tagPhotos_form(photoIdList):
"Expects a LIST of photo objects (ie. photo_sharing.models.photo)"
fields = {}
for id in photoIdList:
id = str(id)
fields[id+'_name'] = forms.CharField()
fields[id+'_tags'] = TagField()
fields[id+'_description'] = forms.CharField(widget=forms.Textarea)
return type('tagPhotos', (forms.BaseForm,), { 'base_fields': fields })
注意标记不是django的一部分,但它是免费的,非常有用。检查出来:django-tagging
答案 0 :(得分:15)
是的,可以在Django中动态创建表单。您甚至可以将动态字段与普通字段混合和匹配。
class EligibilityForm(forms.Form):
def __init__(self, *args, **kwargs):
super(EligibilityForm, self).__init__(*args, **kwargs)
# dynamic fields here ...
self.fields['plan_id'] = CharField()
# normal fields here ...
date_requested = DateField()
有关此技术的更好详细说明,请参阅James Bennett的文章:您想要一个动态表单吗?
答案 1 :(得分:7)
如果你跑
python manage.py shell
并输入:
from app.forms import PictureForm
p = PictureForm()
p.fields
type(p.fields)
你会看到p.fields是一个SortedDict。你只需要插入一个新字段。像
这样的东西p.fields.insert(len(p.fields)-2, 'fieldname', Field())
在这种情况下,它会在最后一个字段之前插入一个新字段。您现在应该适应您的代码。
其他替代方法是在模板中创建一个for / while循环,然后用HTML格式化表单,但django由于某种原因形成摇滚,对吗?
答案 2 :(得分:7)
使用多种形式(django.forms.Form而非标签)
class Foo(forms.Form):
field = forms.Charfield()
forms = [Foo(prefix=i) for i in xrange(x)]
或使用self.fields动态地向表单添加多个字段。
class Bar(forms.Form):
def __init__(self, fields, *args, **kwargs):
super(Bar, self).__init__(*args, **kwargs)
for i in xrange(fields):
self.fields['my_field_%i' % i] = forms.Charfield()