21

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 })

注意タグ付けは django の一部ではありませんが、無料で非常に便利です。確認してください:django-tagging

4

3 に答える 3

20

はい、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 の記事を参照してください: So you want a dynamic form?

http://www.b-list.org/weblog/2008/nov/09/dynamic-forms/

于 2009-01-05T02:35:12.313 に答える
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フォームは何らかの理由で揺れ動きますよね?

于 2009-01-04T22:57:03.237 に答える
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()
于 2009-01-04T23:00:48.483 に答える