2012-05-30 2 views
6

Одна из форм, в которой я нуждаюсь, представляет собой совокупность простых полей (например, «Департамент», «Строительство» и «Номер номера») и динамически генерируемых пар полей (например, «Имя» и «Имя», Эл. адрес"). В идеале, редактирование содержимого простых полей и добавление/удаление пар динамических полей было бы выполнено в одной форме.Django: Formset как поле формы

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

Большое спасибо за любые советы по этим вопросам,

+0

Нам нужен код для начала работы =) – okm

ответ

8

Я не уверен, где идея, что вам нужно «встроить Formset в поле» происходит от; это звучит как случай для standard usage of formsets.

Например (делая целый ряд предположений о ваших моделях):

class OfficeForm(forms.Form): 
    department = forms.ModelChoiceField(... 
    room_number = forms.IntegerField(... 

class StaffForm(forms.Form): 
    name = forms.CharField(max_length=... 
    email = forms.EmailField(... 

from django.forms.formsets import formset_factory 

StaffFormSet = formset_factory(StaffForm) 

И затем, по вашему мнению:

def add_office(request): 
    if request.method == 'POST': 
     form = OfficeForm(request.POST) 
     formset = StaffFormSet(request.POST) 

     if form.is_valid() && formset.is_valid(): 
      # process form data 
      # redirect to success page 
    else: 
     form = OfficeForm() 
     formset = StaffFormSet() 

    # render the form template with `form` and `formset` in the context dict 

Возможные улучшения:

  • Используйте django-dynamic-formset jQuery plugin, чтобы получить желаемое «добавить произвольное количество сотрудников в офис», не показывая u каждый раз хранит стек пустых форм.
  • Вместо этого используйте model formsets (при условии, что информация, которую вы собираете, поддерживает модели Django), поэтому вам не нужно явно указывать имена полей или типы.

Надеюсь, это поможет.

+1

Спасибо, что указали это. Меня заблуждал тот факт, что я подумал (кто знает почему), что было бы более практичным, если бы «StaffFormSet» каким-то образом был объявлен как поле «OfficeForm». Я попробую попробовать. – Mark

+0

Я также ошибочно считал, что набор форм должен быть полем формы, но этот ответ помог. Чтобы добавить ответ, в вашем шаблоне вы будете отображать 'form' и' formet' внутри одного и того же тега HTML 'form'. Таким образом, все данные формы возвращаются в том же POST. – Seth

Смежные вопросы