2012-04-12 11 views
8

私はちょうどdjangoフォームで(しかし、厄介な)小さな問題を抱えています。django crispy-forms&floppyforms with bootstrap:help_textをModelFormに挿入する方法は?

私が使用している:

  • さえずりを
  • ブートストラップジャンゴfloppyforms(ただHTML5ウィジェットの場合)(テンプレートタグ&レンダリング用)
  • Djangoのクリスピー・フォーム
  • を自分のフォームがされていますすべてModelForms可能な場合は変更しないでください。

私はウェブ全体を検索して大量のものを試しましたが、help_text = "Some random help text"をコードに挿入できる場所を特定できません。だからここに私のコードは、(健全性の理由から略す)です:

#forms.py: 

import floppyforms as forms 
from crispy_forms.helper import FormHelper 
from crispy_forms.layout import * 
from crispy_forms.bootstrap import * 
from courses.models import * 

class CourseForm(forms.ModelForm): 
    class Meta: 
    model = Course 
    widgets = { 
     'title': forms.TextInput, # This is a floppyforms widget 
     ... 
    } 

    def __init__(self, *args, **kwargs): 
     self.helper = FormHelper() 
     self.helper.form_method = 'POST' 
     self.helper.form_id = '' 
     self.helper.form_class = 'form-horizontal' 
     self.helper.form_action = '' # redirect in the view 
     self.helper.form_tag = True 
     self.helper.help_text_inline = True # means that I want <span> elements 
     self.helper.layout = Layout(
      Fieldset('Create a new course', # fieldset label 
       Field('title', placeholder="Something...", css_class="span4"), 
       ... 
      ), 
      FormActions(
       Submit(
        'submit', 
        'Submit', 
        css_class="btn-primary" 
       ) 
      ), 
     ) 
     super(CourseForm, self).__init__(*args, **kwargs) 

私はウィジェットに「attrsに」dictのようおよびフィールドにATTRとしてそれを注入しようとしました。

forms.TextInput(attrs={'help_text': 'Some help text'}) 
Field('title', help_text="Some help text", css_class="span4") 

言うまでもなく、動作しませんでした。 入力ウィジェットではなく、ヘルプテキストを私のcontrols-div内の 'span'または 'p'に入れるにはフックが必要です。

テンプレートは非常に小さく、可能な場合はそのままにしてください。私は、フォームフィールドを反復処理する必要はありません:

<div id="div_id_title" class="clearfix control-group"> 
    <label class="control-label requiredField" for="id_title"> 
    Title 
    <span class="asteriskField">*</span> 
    </label> 
    <div class="controls"> 
    <input id="id_title" class="span4 textinput textInput" type="text" placeholder="Something..." maxlength="60" required="" name="title"> 
    </div> 
</div> 

ヘルプテキストでは、それは次のようになります:

<div id="div_id_title" class="clearfix control-group"> 
    <label class="control-label requiredField" for="id_title"> 
    Title 
    <span class="asteriskField">*</span> 
    </label> 
    <div class="controls"> 
    <input id="id_title" class="span4 textinput textInput" type="text" placeholder="Something..." maxlength="60" required="" name="title"> 
    **<span class="help-inline">Supporting help text</span>** 
    </div> 
</div> 

次のHTMLとしてレンダリング

#create_course.html 

{% extends 'base.html'%} 
{% load crispy_forms_tags %} 

{% block content%} 
{% crispy form %} 
{% endblock content%} 

どんな助けもありがとう!私は、フォームにviews.pyを通してコードを注入しようとはしませんでしたが、それを行う際には何のポイントもありません。それは右のフックと構文でforms.pyでそれを行うことができるはずです。

このような単純な問題のために長いテキストのため申し訳ありません;)

+0

[OK]問題の内容を確認しました。私は実際にフィールドをどこにも定義しなかったので(私はフィールドウィジェットを定義しただけでした)、私はhelp_textにアクセスできませんでした。 forms.pyにFieldsを定義することができます(ModelFieldsはDRYです)。またはmodels.pyのモデルのhelp_textを設定します。 – tiwei

+0

私はあなたがそれを解決してうれしいです。モデルでhelp_textを指定する方がよいでしょう。しかし、フィールドを再定義せずにオーバーライドすることもできます。スライド34を参照してください。https://speakerdeck.com/u/maraujop/p/advanced-django-forms-usage – maraujop

+1

あなたのコメントを回答として投稿して受け入れることができますか?そうすれば、それは未回答の質問として現れません。 –

答えて

8

私は、問題が何であったかが分かりました。私は実際にフィールドをどこにも定義しなかったので(私はフィールドウィジェットを定義しただけでした)、私はhelp_textにアクセスできませんでした。 forms.pyにFieldsを定義するか(必要ないか悪い習慣か、ModelFieldsかどうか)、またはmodels.pyのモデルのhelp_textを設定することができます。

似たような問題を抱えている人を助けることを望みます。

+1

何かの理由で、何らかの理由でモデルに設定されたヘルプテキストを使用したくない場合は、ModelFormの '__init__'メソッドで作成したフィールドにいつでもアクセスできます。 –

関連する問題