4

django-crispy-formsを使用して、 djangoでモデルのフォームをレンダリングしています。django-crispy-formsはすでにTwitterBootstrapと非常によく統合AppendedTextれており、ウィジェットのレイアウトオブジェクトを定義しています。

AppendedTextウィジェット

私のdjangoには次のモデルがありますmodels.py

class Historia(models.Model):
    persona         = models.ForeignKey('Persona', 
                                  blank=False, 
                                  null=True,
                                  related_name='historias')
    fecha           = models.DateTimeField(unique=True, 
                                auto_now_add=True)
    motivo          = models.TextField()
    peso            = models.DecimalField(blank=True,
                                   max_digits=5, decimal_places=2)
    talla           = models.IntegerField(blank=True)
    tension         = models.CharField(max_length=15)
    pulso           = models.IntegerField()
    diagnostico     = models.TextField()
    tratamiento     = models.TextField()
    pendiente       = models.TextField(blank=True)

modelformそして私は以下を定義しますforms.py

class HistoriaForm(django.forms.ModelForm):
    class Meta:
        model = models.Historia

    def __init__(self, *args, **kwargs):
        super(HistoriaForm, self).__init__(*args, **kwargs)

        self.helper = FormHelper(self)
        self.helper.form_class = 'form-horizontal'
        self.helper.form_tag = True
        self.helper.form_id = 'nueva_historia_form'
        self.helper.form_action = 'nueva_historia'

        self.helper.form_show_errors = True
        self.helper.error_text_inline = False

        self.helper.add_input(Submit('crear', 'Crear'))

私の質問は、すでにレイアウトオブジェクトを定義しているので、新しいサブクラスpesoを作成せずにフィールドのウィジェットを変更するにはどうすればよいですか。次のようにするために、他のすべてのフィールドを列挙したくないことにも注意してください。widgetdjango-crispy-forms

self.helper.layout = Layout(
            Fieldset(
                'Legend',
                'nombre',
                'apellido',
                AppendedText('peso', 'kg')
            ),
            ButtonHolder(
                Submit('submit', 'Submit', css_class='button white')
            )
        )

モデルに新しいフィールドを追加する場合は、ヘルパーレイアウトを編集し続ける必要があるため、標準のウィジェットがすでに非常に便利です。

編集:私はヘルパーのようなレイアウトにアクセスする方法も見ましたが、self.helper.layout[0] = AppendedText('peso', 'kg')変更したいフィールドのインデックスがわかりません。self.helper.layout['peso'] = AppendedText('peso', 'kg')

4

2 に答える 2

6

django-crispy-forms には、これらの種類の API があります: http://django-crispy-forms.readthedocs.org/en/latest/dynamic_layouts.html

あなたは単に行うことができます:

form.helper['peso'].wrap(AppendedText, "kg")
于 2013-03-24T17:10:32.883 に答える
2

わかりました、これは私にとってうまくいきました。冗長になりすぎず、シンプルに保つ必要はありません。__init__メソッドでは、次のことを行うだけです。

for i, field in enumerate(self.helper.layout):
    if field == 'peso':
        self.helper.layout[i] = AppendedText('peso', 'kg')

探しているフィールドがlayoutオブジェクトの階層の最初のレベルにある場合、これは問題なく機能します。それ以外の場合は、探しているものをより具体的にする必要があります。たとえば、フィールドがDIVコンテナ内にある場合、最初に確認する必要がfield.__class__ == DIVあり、次にフィールドをイントロスペクトする必要がありますが、DIVこれは見た目ほど簡単ではありません。

layoutただし、フィルタ クエリをサポートするオブジェクトの API があると便利です。

于 2013-03-17T14:40:33.510 に答える