【问题标题】:Variable number of inputs with Django forms possible?可以使用 Django 表单进行可变数量的输入吗?
【发布时间】:2010-09-29 12:46:29
【问题描述】:

是否可以使用 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 })

note 标记不是 django 的一部分,但它是免费的并且非常有用。看看:django-tagging

【问题讨论】:

  • 我不明白这一切是如何协同工作的:你有一些代码或 git repo 以及更完整的示例吗?

标签: python django django-forms


【解决方案1】:

是的,可以在 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/

【讨论】:

    【解决方案2】:

    如果你跑了

    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 表单由于某种原因而摇摆不定,对吧?

    【讨论】:

    • 几乎给了你接受的答案,杰夫的只是更清楚一点(链接帮助很大)
    【解决方案3】:

    使用多个表单(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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-14
      • 1970-01-01
      • 1970-01-01
      • 2011-09-17
      • 2011-03-29
      • 1970-01-01
      • 2015-06-02
      • 2016-09-29
      相关资源
      最近更新 更多