2012-10-27 13 views
16

Znalazłem się w crispy form, i wydaje się, że robię dokładnie to, co chcę: renderowanie formularzy z układem bootstrap.Użyj chrupiącego formularza z ModelForm

Teraz przykład mówi o używaniu forms.Form. To jest w porządku, mogę utworzyć kopalnię, pisząc kod taki jak ten:

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) 

Ale jak przeprowadzić aktualizację? bo jeśli ja kładę to w widoku:

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

to nie działa, ponieważ instancji jest tylko dla ModelForm.

Teraz mogę zastąpić model.Form z ModelForm i użyć chrupiącego formularza dla ModelForm? Zrobiłem to

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') 

Tutaj dodałem klasę Meta. Teraz: działa, ale czy to prawda, aby używać go w ten sposób? Aktualizacja działa również w ten sposób.

Jaki jest poprawny sposób używania formularzy do aktualizacji?

Odpowiedz

42

Jestem głównym programistą django-crispy-form. Nie jestem pewien, czy podążam za twoim pytaniem, ponieważ jest trochę źle sformatowany. Co dokładnie próbujesz zrobić?

Django-crispy-forms współpracuje z ModelForms, tak samo jak w przypadku prostych formularzy. Jest na szczycie Django, więc nie zadziewa z tym. Kontroluje on tylko renderowanie formularza, ale nie zmienia sposobu sprawdzania poprawności, tworzenia instancji formularzy itd.

EDIT:

Dodaję przykład o tym, jak zrobić ModelForm z chrupiącymi form.

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 

wierzę Twój pierwszy problem jest to, że zostały instacji forms.Form zamiast forms.ModelForm. Dlatego powiedziałem, że twój problem dotyczył Django, a nie chrupiących form.

Później w widoku:

form = ExampleModelForm() 

W szablonie:

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

Co mam zrobić, aby używać go z ModelForm? – EsseTi

+0

Edytowałem odpowiedź. – maraujop

+0

@maraujop: Proszę spojrzeć na to pytanie: http://stackoverflow.com/questions/16581057/formhelper-object-has-no-attribute-append-while-using-crispy-forms-in-django To Problem pojawił się, kiedy robiłem to, co tu powiedziano. –

Powiązane problemy