[Python] Возможно изменение количества входов с формами Django?


Answers

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

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

Question

Возможно ли иметь переменное число полей, использующих формы джанго?

Конкретным приложением является следующее:

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

Итак, как мне получить 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 })

примечание tagging не является частью django, но оно бесплатное и очень полезно. проверить: django-tagging






Links