向Django crispy-forms字段添加额外的HTML标记和属性

时间:2014-09-19 06:38:33

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

我正在使用带有Bootstrap的django-crispy-forms,我想在单个字段中为HTML渲染添加一些额外的HTML

例如,如果我的表单包含,

recipients = forms.CharField(label='To',widget=forms.TextInput(
    attrs={'placeholder': 'Enter phone number, contact or group (add as many as you like)'}))

然后正常渲染(使用Bootstrap模板)是,

<div id="div_id_recipients" class="control-group">
    <label for="id_recipients" class="control-label requiredField">
         To<span class="asteriskField">*</span>
    </label>
    <div class="controls">
         <input class="textinput textInput" id="id_recipients" name="recipients" placeholder="Enter phone number, contact or group (add as many as you like)" type="text">
    </div>
</div>

我想要做的是在最终结束div之前出现一些额外的HTML。所以它看起来像,

<div id="div_id_recipients" class="control-group">
    <label for="id_recipients" class="control-label requiredField">
         To<span class="asteriskField">*</span>
    </label>
    <div class="controls">
         <input class="textinput textInput" id="id_recipients" name="recipients" placeholder="Enter phone number, contact or group (add as many as you like)" type="text">
    </div>

    <div class="controls-aside">
         <button type="button" class="btn">Address Book</button>
         <button type="button" class="btn">Add Contact</button>
    </div>

</div>

我知道我可以使用自定义模板替换此字段的现有模板,但我希望能够在不进行复制/粘贴的情况下重复使用其模板,因为这使得它不易维护。

那么实现这个的最佳方法是什么?如果有人可以建议怎么做,我还想在标签中添加一个额外的课程?

2 个答案:

答案 0 :(得分:2)

  1. 为了完整性,但不适用于您的情况:即使在创建布局后,如果只需要将控件包装到另外的Div中,Layout.wrap('recipients', Div)也会起作用。

  2. 关于在布局中添加HTML。上个小时我需要一个非常自定义的HTML,所以这样做了:

  3. (格式化)

    i = self.helper.layout.fields.index('guest_email')
    self.helper.layout.insert(
        i+1,
        HTML('<a href="{}">{}</a>'.format(
            reverse_lazy('invite_guests'),
            _('Invite to a party'))
    ))
    

    我来这里搜索Crispy Forms的HTMLWrapper类示例,以便我可以做一个更漂亮的事情:

    self.helper['guest_email'].wrap(HTMLWrapper(
        'guest_email', 
         before='',
         after='<a href="{}">{}</a>'.format(href, title))
    

    如果我最终创建一个,我会回来发布它。

答案 1 :(得分:0)

对我而言,它的工作方式如下:

from crispy_forms.layout import Field, HTML

self.helper["some_field_name"].wrap(Field, HTML("<p>Example</p>"))

使用HTML的好处是它还使您可以使用上下文变量。