Фабрика множественных форм Django - PullRequest
7 голосов
/ 31 августа 2010

Как лучше всего справляться с несколькими формами?Я хочу объединить несколько форм в одну.Например, я хочу объединить ImangeFormSet и EntryForm в одну форму:

class ImageForm(forms.Form):
    image = forms.ImageField()
ImageFormSet = formset_factory(ImageForm)

class EntryForm(forms.Form):
    title = forms.CharField(max_length=100)

result_form = combine(EntryForm, ImageFormSet) # here it goes

Я обнаружил, что 2-летняя презентация представляет метод multipform_factory (), но я не уверен, что это лучший способ: http://www.slideshare.net/kingkilr/forms-getting-your-moneys-worth

Ответы [ 2 ]

4 голосов
/ 01 сентября 2010

Идея (не проверено, работает ли она):

class MySuperForm(CombinedForm):
    includes = (ImageForm, EntryForm, )

Вы смотрите здесь как строится форма.Вы можете создать свою собственную форму, расширив ее от BaseForm и предоставив другую __metaclass__.

class CombinedForm(BaseForm):
  __metaclass__ = DeclarativeFieldsMetaclassFromMultipleClasses

. В DeclarativeFieldsMetaclassFromMultipleClasses вы в основном делаете то же самое, что и здесь , за исключением того, что вы суммируете объявленные поля иззанятия по

class DeclarativeFieldsMetaclassFromMultipleClasses(type):
  def __new__(cls, name, bases, attrs):
    for clazz in attrs['includes']:
      attrs['base_fields'] += get_declared_fields(bases, clazz.attrs)
    new_class = super(DeclarativeFieldsMetaclassFromMultipleClasses,cls).__new__(cls, name, bases, attrs)
    if 'media' not in attrs:
      new_class.media = media_property(new_class)
    return new_class
3 голосов
/ 02 сентября 2010

Неважно, сколько форм помещено в шаблон, потому что отдельные формы не отображают тег формы.Итак, ваш шаблон выглядит следующим образом

<form id='xxxx' action='' method=POST>  
  {{my_first_formset}}  
  {{my_second_form}}  
</form>  

и в view.py

my_formset = MyFormset(request.POST)  
my_form = MyForm(request.POST)  
if my_formset.is_valid() and my_form.is_valid():  
   process...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...