15

別のフォームの真ん中にレイアウトしたいdjangoフォームセットがあります。私はdjango-crispy-formsを使用して、親フォームのレイアウトを設定しています__init__:

from crispy_forms.helper import FormHelper
from crispy_forms.layout import Submit, Layout, Field, Div
def __init__(self, *args, **kwargs):
    self.helper = FormHelper()
    self.helper.layout = Layout(
        Div(
            Div(Field('foo'), css_class='span3'),
            Div(Field('bar'), css_class='span4'),
            css_class='row'
            ),
        Field('baz', css_class='span1'),
            ...
            )
    self.helper.add_input(Submit('submit', 'Submit', css_class='btn btn-primary offset4'))

私のテンプレートは、{% crispy %}タグを使用してフォームをレンダリングするだけです。

フォームセットを組み込む方法を知りたいです。上記の init 関数でインスタンス化する必要がありますか? そこをどのように参照すればよいでしょうか。

オンラインでフォームとフォームセットのコンボを連続してレンダリングする例は他にもありますが、それらがクリスピーのレイアウトとどのように適合するかをより詳細に制御できるかどうか疑問に思っています。

4

4 に答える 4

26

フォームセットをレンダリングする新しいフィールド タイプを作成することで、Crispy Forms を変更せずにこれを解決しました。

from crispy_forms.layout import LayoutObject, TEMPLATE_PACK

class Formset(LayoutObject):
    """
    Layout object. It renders an entire formset, as though it were a Field.

    Example::

    Formset("attached_files_formset")
    """

    template = "%s/formset.html" % TEMPLATE_PACK

    def __init__(self, formset_name_in_context, template=None):
        self.formset_name_in_context = formset_name_in_context

        # crispy_forms/layout.py:302 requires us to have a fields property
        self.fields = []

        # Overrides class variable with an instance level variable
        if template:
            self.template = template

    def render(self, form, form_style, context, template_pack=TEMPLATE_PACK):
        formset = context[self.formset_name_in_context]
        return render_to_string(self.template, Context({'wrapper': self,
            'formset': formset}))

フォームセットをレンダリングするにはテンプレートが必要です。これにより、レンダリング方法を正確に制御できます。

{% load crispy_forms_tags %}

<div class="formset">
    {% crispy formset %}
    <input type="button" name="add" value="Add another" />
</div>

これを使用して、他の Crispy レイアウト要素と同様に、フォームセットをレイアウトに埋め込むことができます。

self.helper.layout = Layout(
    MultiField(
        "Education",
        Formset('education'),
    ),
于 2014-02-26T21:40:10.467 に答える
5

これは現在、クリスピー フォームではサポートされていません。唯一のオプションは、|as_crispy_fieldフィルターを使用することです (まだ文書化されていません。申し訳ありません)。

タグと機能ブランチでこの機能の開発を開始{% crispy %}しました。すべてここで説明されています: https://github.com/maraujop/django-crispy-forms/issues/144

フィードバックをお待ちしていますので、まだ興味がある場合は、お気軽に投稿してください。

于 2013-05-12T12:49:31.090 に答える