【问题标题】:Rendering separate MultiWidget fields using Django Crispy Forms使用 Django Crispy Forms 渲染单独的 MultiWidget 字段
【发布时间】:2014-12-07 11:38:49
【问题描述】:

我的具体情况是我需要在一行中呈现这个字段(使用 Bootstrap 3):

比如:

<div class="form-group">
    <label>Amount:</label>
    <div class="row">
        <input name="amount_0" type="number" class="col-xs-8">
        <select name="amount_1" class="col-xs-4">...</select>
    </div>
</div>

使用:https://github.com/jakewins/django-money
小部件:https://github.com/jakewins/django-money/blob/master/djmoney/forms/widgets.py

型号:

from djmoney.models.fields import MoneyField

class MyModel(models.Model):
    ...
    amount = MoneyField(...)
    ...

表格:

class MyForm(forms.ModelForm):
    ...
    @property
    def helper(self):
        helper = FormHelper()
        helper.form_tag = False

        helper.layout = Layout()
        helper.layout.fields = [
            ...
            'amount',
            ...
        ]

        return helper
    ...

【问题讨论】:

    标签: django twitter-bootstrap-3 django-crispy-forms


    【解决方案1】:

    不处理字段小部件的呈现, 处理。与django.forms.MultiWidget 相同。
    不会单独渲染 MultiWidget 中的每个字段。

    见:django.forms.MultiWidget.format_output(rendered_widgets)

    这是在 Django 1.10 中如何将 MultiWidget 渲染到 列-:

    from djmoney.forms.widgets import MoneyWidget
    
    
    class CustomMoneyWidget(MoneyWidget):
        def format_output(self, rendered_widgets):
            return ('<div class="row">'
                        '<div class="col-xs-6 col-sm-10">%s</div>'
                        '<div class="col-xs-6 col-sm-2">%s</div>'
                    '</div>') % tuple(rendered_widgets)
    
    
    class BookingForm(forms.ModelForm):
        ...
        def __init__(self, *args, **kwargs):
            super(BookingForm, self).__init__(*args, **kwargs)
    
            amount, currency = self.fields['amount'].fields
    
            self.fields['amount'].widget = CustomMoneyWidget(
                amount_widget=amount.widget, currency_widget=currency.widget)
        ...
    

    对于 Django 1.11+:

    由于change,您需要使用new template api。相反,您的自定义货币小部件应如下所示:

    class CustomMoneyWidget(MoneyWidget):
        template_name = 'widgets/money.html'
    

    带有模板money.html

    <div class="row">
        <div class="col-xs-6 col-sm-10">
            {% with widget=widget.subwidgets.0 %}
                {% include widget.template_name %}
            {% endwith %}
        </div>
        <div class="col-xs-6 col-sm-2">
            {% with widget=widget.subwidgets.1 %}
                {% include widget.template_name %}
            {% endwith %}
        </div>
    </div>
    

    【讨论】:

      猜你喜欢
      • 2020-10-14
      • 1970-01-01
      • 2012-06-29
      • 2014-03-12
      • 2020-08-28
      • 2021-05-29
      • 2019-12-31
      • 2020-10-19
      • 2014-02-22
      相关资源
      最近更新 更多