2010-03-24 3 views
6

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

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

ответ

7

Посмотрите на этот пост недавно Якоба Каплан-Мосс, один из основателей Django: "Dynamic form generation". Он использует пример, чтобы показать вам процесс шаг за шагом. Отлично.

Существует также a 2008 article by James Bennett, диспетчер выпуска Django.

5

Для добавления, удаления и изменения полей на форме или ModelForm, просто переопределить __init__() так:

class MyForm(forms.Form): 
def __init__(self, *args, **kwargs): 
    user = kwargs.pop('user') 
    other_stuff = kwargs.pop('stuff') 

    super(MyForm, self).__init__(*args, **kwargs) 

    self.fields['my_dynamic_field'] = forms.Field(...) 

    # Add fields based on user or other_stuff 

И использовать его как это: form = MyForm(user = user, stuff = stuff)

+0

Примечание: я не могу отправить пользователя kwarg в супер __init__; raise "__init __() получил неожиданный аргумент ключевого слова 'user' ' – ecdani

+0

Решенный: kwargs.pop должен прийти до супервызов – ecdani

5

В Python вы можете создать экземпляр класса динамически. knutin показывает хороший пример динамической настройки формы на основе и добавления нескольких полей.

Вы также можете создать всю форму динамически, так как взяты из example given by James Bennett:

def make_contact_form(user): 
    fields = { 'name': forms.CharField(max_length=50), 
      'email': forms.EmailField(), 
      'message': forms.CharField(widget=forms.Textarea) } 
    if not user.is_authenticated(): 
    fields['captcha'] = CaptchaField() 
    return type('ContactForm', (forms.BaseForm,), { 'base_fields': fields }) 
Смежные вопросы