我正在使用带有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>
我知道我可以使用自定义模板替换此字段的现有模板,但我希望能够在不进行复制/粘贴的情况下重复使用其模板,因为这使得它不易维护。
那么实现这个的最佳方法是什么?如果有人可以建议怎么做,我还想在标签中添加一个额外的课程?
答案 0 :(得分:2)
为了完整性,但不适用于您的情况:即使在创建布局后,如果只需要将控件包装到另外的Div
中,Layout.wrap('recipients', Div)
也会起作用。
关于在布局中添加HTML。上个小时我需要一个非常自定义的HTML,所以这样做了:
(格式化)
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的好处是它还使您可以使用上下文变量。