2012-10-27 9 views
16

私はcrispy formを実行していました。これは、私が望むものとまったく同じようです:ブートストラップレイアウトのフォームをレンダリングします。ModelFormでクリスピーフォームを使用する

ここでは、forms.Formの使用例について説明します。アップデートを行う方法を、

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) 

しかし:これはOKですが、私はこのようなコードを書くことで鉱山を作成することができますか?ので、私はビューでこれを置く場合:インスタンスが唯一のModelFormですので

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

が、それは動作しません。

ここでmodel.FormModelFormに置き換え、ModelFormに新鮮なフォームを使用できますか? 私はこれをしました

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

ここで私はMetaクラスを追加しました。 今すぐ動作しますが、このように使用するのは正しいですか? この方法でも更新プログラムは機能します。

更新を行うためにフォームを使用する正しい方法は何ですか?

答えて

42

私はdjango-crispy-formsの主導的な開発者です。私はちょっとフォーマットされていないので、私はあなたの質問に従うか分からない。あなたは正確に何をしようとしていますか?

django-crispy-formsは、単純なフォームと同じようにModelFormsで動作します。それはDjangoの上に座っているので、それを混乱させません。フォームのレンダリングのみを制御しますが、検証の仕組み、フォームインスタンスの作成方法などは変更しません。

EDIT:

私はサクサク-フォームでModelFormを行う方法について例を追加しています。

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 

私はあなたの最初の問題は、あなたがforms.Form代わりのforms.ModelFormをサブクラス化していることであると信じています。だからこそ私はあなたの問題はDjango関連で、クリスピーフォームとは関係ないと言ったのです。

後でビューで:あなたのテンプレートで

form = ExampleModelForm() 

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

のModelFormでそれを使用するために行うために、私は何をしたのですか? – EsseTi

+0

私は答えを編集しました。 – maraujop

+0

@maraujop:この質問をご覧ください:http://stackoverflow.com/questions/16581057/formhelper-object-has-no-attribute-append-while-using-crispy-forms-in-django これは私がここで言われたことをしていたときに問題が生じました。 –

関連する問題