7 Stimmen

Django Mehrfachformularfabrik.

Was ist der beste Weg, um mit mehreren Formularen umzugehen? Ich möchte mehrere Formulare zu einem kombinieren. Zum Beispiel möchte ich ImangeFormSet und EntryForm zu einem Formular kombinieren:

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) # hier geht es weiter

Ich habe eine 2 Jahre alte Präsentation gefunden, die die Methode multipleform_factory() vorstellt, bin mir aber nicht sicher, ob es der beste Weg ist: http://www.slideshare.net/kingkilr/forms-getting-your-moneys-worth

4voto

Andre Bossard Punkte 6145

Eine Idee (nicht überprüft, ob es funktioniert):

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

Sie können hier sehen, wie das Formular erstellt wird. Sie können Ihr eigenes Formular erstellen, indem Sie von BaseForm erben und eine andere __metaclass__ bereitstellen.

class CombinedForm(BaseForm):
  __metaclass__ = DeclarativeFieldsMetaclassFromMultipleClasses

In DeclarativeFieldsMetaclassFromMultipleClasses machen Sie im Grunde dasselbe wie hier, außer dass Sie die deklarierten Felder aus den Klassen zusammenführen

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

3voto

Narendra Kamma Punkte 1421

Es spielt keine Rolle, wie viele Formulare im Template platziert sind, da einzelne Formulare das Formular-Tag nicht rendern. Also sieht dein Template so aus

  {{my_first_formset}}  
  {{my_second_form}}  

und in view.py

my_formset = MyFormset(request.POST)  
my_form = MyForm(request.POST)  
if my_formset.is_valid() and my_form.is_valid():  
   Verarbeite...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X