2013-02-20 9 views
5

を使用するdjango-crispy-forms私は1つの行に2つ(以上)のウィジェットを組み合わせたいと思う。添付の例も参照してください。ドキュメンテーションにはこの問題の例が含まれていて、ソースコードも役に立たなかったものの、そのライブラリを使用することが可能でなければならないと思います。だから、誰もがdjango-crispy-formsを使って同様の結果を得ることができましたか?django-crispy-formsのコントロール行を作成する

Example controls-row

、このような形のために必要なHTMLは次のようになります。

<div class="control-group"> 
    <label for="desc" class="control-label"> 
     Description 
    </label> 
    <div class="controls controls-row"> 
     <input class="span2" maxlength="255" type="text" id="desc"> 
     <input class="span3" maxlength="255" type="text"> 
    </div> 
</div> 

答えて

3

あなたはDEF のinit(自己、* argsを、** kwargsから `でHTMLオブジェクトを定義すると、それを行うことができます):レイアウトオブジェクト内。このHTMLは、あなたが必要とするすべての自由を与えます。

別の方法もあります。実際には、テンプレート内のフォルダに独自のテンプレートを作成してからレイアウトオブジェクトでそのテンプレート 例へのパスを定義するには:「名前」は、実際のウィジェットです

Field('name', template='path/to/template/single_line_input.html'), 

float: leftdisplay: inlineのようなCSSファイルで遊んでみることもできますが、インラインで表示するウィジェットでクラスを定義する必要があります。これは、フロントエンドのCSSに熟練していない人にとっては少し難解かもしれません(結果はさまざまなブラウザや異なる解像度で異なる可能性がありますので、いくつかのテストが必要です)。 問題は、主に、ブラウザが入力フィールドをデフォルトでブロックオブジェクトとしてレンダリングしているため、幅が狭くても1行ですべてのスペースを占めることです。

+0

ありがとう:

from django import forms from crispy_forms.helper import FormHelper class MyWidget(forms.MultiWidget): widgets = (forms.TextInput(), forms.TextInput()) super(ExpirationDateWidget, self).__init__(widgets) def decompress(self, value): if value: return value.split('|') # or however you combined the two values return [None, None] class MyMultiField(forms.MultiValueField): def __init__(self, *args, **kwargs): self.widget = MyWidget(*args, **kwargs) def compress(self, data_list): return data_list[0] + '|' + data_list[1] # or other logical compression class MyForm(forms.Form): multi_field = MyMultiField() # other fields like category and category_new def __init__(self, *args, **kwargs): self.helper = FormHelper() self.helper.form_class = 'form-horizontal' self.helper.layout = Layout('multi_field', 'category', 'category_new') 

これは次のようになります。あなたの答えは受け入れられているとマークしましたが、私はすぐに何かを期待していました。 – bouke

+0

'Field( 'name'、template = 'path/to/template/single_line_input.html')の+1、' – suhailvs

7

はい。使用Layouts

ここでは、あなたのためのスニペットを示します。

def __init__(self, *args, **kwargs): 
    self.helper = FormHelper() 
    self.helper.form_method = 'get' 
    self.helper.form_id = 'id_search' 
    self.helper.layout = Layout(
      Div(
       Div(Field('arrival_date', css_class='span12 input-large calendar', 
        placeholder='dd/mm/yyyy'), css_class='span5'), 
       Div(Field('departure_date', css_class='span12 input-large calendar', 
        placeholder='dd/mm/yyyy'), css_class='span5'), 
       Div(Field('rooms', css_class='span12'), css_class='span2 styled-rooms'), 
       css_class='row-fluid', 
      ), 
     ) 
+0

これは3つのフィールドのラベルをレンダリングしますので、CSSの修正を含めて隠す必要がありますそれらの要素。どのようにdjango-crispy-formsを使ってこれを行うのですか? – bouke

+0

https://docs.djangoproject.com/en/dev/ref/forms/fields/#label単純に 'label = ''' ' – super9

+0

を設定します。ここに投稿された回答の組み合わせを使用しています。 'label = '''を設定すると、CSSを使って隠す必要がある '

2

あなたはこの動作を取得するためにMultiValueFieldMultiWidgetを使用することができます。 compressdecompressの方法について考えて修正する必要がありますが、次のような方法があります。

<div id="div_id_multi_field" class="control-group"> 
    <label for="id_multi_field_0" class="control-label">Multi Field</label> 
    <div class="controls"> 
     <input id="id_multi_field_0"> 
     <input id="id_multi_field_1"> 
    </div> 
</div> 
+0

お返事ありがとうございます。しかし、2つのフィールドを連結するだけの作業はたくさんあるようです。 – bouke

+0

合意しました。間違いなく多くのコードです。しかし、私は予測可能なHTMLを提供し、他のフィールドと一貫して特別なハッキングを必要としない方法でヘルプテキストとエラーメッセージを簡単に配置できることを発見しました。悲しいことに、2つのフィールドは "あなたの毒を選ぶ"シナリオのように感じます... – dfrdmn

関連する問題