Переменное число входов с формами Django возможно? - PullRequest
18 голосов
/ 05 января 2009

Можно ли иметь переменное количество полей, используя формы django?

Конкретное приложение это:

Пользователь может загрузить столько изображений, сколько он хочет, в форме загрузки изображений. Как только изображения загружены, они переносятся на страницу, где они могут дать фотографиям имя и описание. Количество картинок будет зависеть от того, сколько пользователь выбрал для загрузки.

Итак, как мне заставить django сгенерировать форму, используя переменное число полей ввода (которые могут быть переданы в качестве аргумента при необходимости)?

edit: С момента написания статьи , упомянутой в ответе Джеффа Бауэра , произошли некоторые изменения.

А именно эта строка кода, которая не работает:

# 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

Ответы [ 3 ]

15 голосов
/ 05 января 2009

Да, в 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()

Чтобы лучше понять эту технику, см. Статью Джеймса Беннетта: Итак, вам нужна динамическая форма?

http://www.b -list.org / блог / 2008 / Ноябрь / 09 / динамические-формы /

7 голосов
/ 05 января 2009

Использовать несколько форм (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()
7 голосов
/ 05 января 2009

Если вы запустите

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 по какой-то причине формирует рок, верно?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...