是否可以使用django表单拥有可变数量的字段?
具体应用如下:
用户可以在图像上载表单上上载任意数量的图片.上传图片后,他们会被带到一个页面,在那里他们可以给图片命名和描述.图片数量取决于用户选择上传的数量.
那么如何让django使用可变数量的输入字段生成表单(如果需要可以作为参数传递)?
编辑:自从杰夫鲍尔的回答中提到的那篇文章以来,有些事情发生了变化.
即这行代码似乎不起作用:
# 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 })
note标记不是django的一部分,但它是免费的,非常有用.看看:django-tagging
是的,可以在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的文章:那么你想要一个动态的形式?
http://www.b-list.org/weblog/2008/nov/09/dynamic-forms/
如果你跑
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因某种原因形成摇滚,对吧?
使用多种形式(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()