2012-10-27 6 views
16

Ich habe in crispy form läuft, und es scheint genau das zu tun, was ich will: Render-Formulare mit Bootstrap-Layout.Verwenden Sie knusprige Form mit ModelForm

Jetzt das Beispiel über die Verwendung von forms.Form sprechen.

class TemplateCreateForm(forms.Form): 
    title = forms.CharField(label=(u'Task name')) 
    description = forms.CharField(label=(u'Task description')) 
    url_start = forms.CharField(label=(u'Start page url')) 
    url_end = forms.CharField(label=(u'Final page url')) 

    def __init__(self, *args, **kwargs): 
     self.helper = FormHelper() 
     self.helper.form_method = 'post' 
     self.helper.add_input(Submit('submit', 'Submit')) 
     super(TemplateCreateForm, self).__init__(*args, **kwargs) 

Aber, wie Sie das Update tun: Das ist in Ordnung, kann ich meine durch Schreiben der Code wie folgt erstellen? denn wenn ich habe dies in der Ansicht:

form = TemplateCreateForm(request.POST or None, instance=template) 

es funktioniert nicht, weil Instanz nur für Modelform ist.

Jetzt kann ich die model.Form durch ModelForm ersetzen und knusprige Formular für ModelForm verwenden? Ich habe diese

class TemplateCreateForm(ModelForm): 
    title = forms.CharField(label=(u'Task name')) 
    description = forms.CharField(label=(u'Task description')) 
    url_start = forms.CharField(label=(u'Start page url')) 
    url_end = forms.CharField(label=(u'Final page url')) 

    def __init__(self, *args, **kwargs): 
     self.helper = FormHelper() 
     self.helper.form_method = 'post' 
     self.helper.add_input(Submit('submit', 'Submit')) 
     super(TemplateCreateForm, self).__init__(*args, **kwargs) 

    class Meta: 
     model = Template 
     exclude = ('user') 

Hier habe ich die Meta-Klasse hinzugefügt. Jetzt: es funktioniert, aber ist es richtig, es so zu benutzen? Das Update funktioniert auch auf diese Weise.

Was ist der richtige Weg, Formulare für das Update zu verwenden?

Antwort

42

Ich bin der führende Entwickler von Django-Crispy-Formen. Ich bin mir nicht sicher, ob ich deiner Frage folge, da sie etwas schlecht formatiert ist. Was genau versuchst du zu tun?

django-crispy-forms funktioniert mit ModelForms genauso wie mit einfachen Formularen. Es sitzt oben auf Django, also macht es nichts damit zu tun. Es steuert nur Ihr Formular-Rendering, ändert aber nicht, wie die Validierung funktioniert, wie Sie Formular-Instanzen erstellen und so weiter.

EDIT:

Ich füge ein Beispiel, wie man ein ModelForm mit knusprigen Formen zu tun.

class ExampleModelForm(forms.ModelForm): 
    def __init__(self, *args, **kwargs): 
     super(ExampleModelForm, self).__init__(*args, **kwargs) 

     # If you pass FormHelper constructor a form instance 
     # It builds a default layout with all its fields 
     self.helper = FormHelper(self) 

     # You can dynamically adjust your layout 
     self.helper.layout.append(Submit('save', 'save')) 

    class Meta: 
     model = ExampleModel 

Ich glaube, Ihr erstes Problem ist, dass Sie forms.Form statt forms.ModelForm Subklassen wurden. Deshalb habe ich gesagt, dass dein Problem Django-bezogene, nicht knusprige Formen waren.

Später in der Ansicht:

form = ExampleModelForm() 

in Ihrer Vorlage:

{% load crispy_forms_tags %} 
{% crispy form %} 
+0

Was mache ich es zu tun habe mit Modelform zu benutzen? – EsseTi

+0

Ich habe die Antwort bearbeitet. – maraujop

+0

@maraujop: Bitte werfen Sie einen Blick auf diese Frage: http://stackoverflow.com/questions/16581057/formhelper-object-has-no-attribute-append-while-using-crispy-forms-in-django Dies Problem kam, als ich tat, was hier gesagt wurde. –