模型表单上的 Django Bootstrap input-group-addon 没有分隔字段
Django Bootstrap input-group-addon on Model Form without separating fields
我目前正在通过以下方式呈现我的 Django 表单:
<form action="/student/" method="post">
{% csrf_token %}
{% bootstrap_form form %}
<input type="submit" value="Launch" class="btn btn-primary"/>
</form>
我有多个不同类型的字段,每个字段应用不同的东西,例如验证器和帮助文本。
我有两个字段想添加 bootstrap 跨度。我想在前面加上一个英镑符号的一个货币字段,以及一个我想附加一个百分比符号的百分比字段,我知道这可以使用 bootstrap 来完成,如下所示:
<div class="input-group">
<span class="input-group-addon">$</span>
<input type="text" class="form-control" placeholder="Price"/>
</div>
但要在我的 Django 模板中执行此操作,需要我将表单分解为特定字段并创建特定字段 html。如This question提出的解决方案。
我正在寻找的是一种在模型或模型形式中指定属性或 class 的方法,它仅适用于特定字段,但会像上面一样呈现它而不会中断填写表格。
谢谢。
信息:
Bootstrap-4
Django-2.0.2
Python-3.6.1
在表单中您可以做什么:
from django.forms import TextInput, Textarea
class MyForm(modelForm):
class Meta:
widgets = {
"name": TextInput({"class": "form-control"}),
"comment": Textarea({"data-validation": "validate"}),
}
您可以在此 link 关于小部件的 django 文档中阅读有关小部件的信息并了解添加自定义属性的不同方法:https://docs.djangoproject.com/en/2.0/ref/forms/widgets/
您需要继承自Base Widget。如果您使用下面的模板,您可以轻松创建自定义 bootstrap 组。
在forms.py
from django import forms
from django.forms import Widget
from django.utils.safestring import mark_safe
class PrependWidget(Widget):
""" Widget that prepend boostrap-style span with data to specified base widget """
def __init__(self, base_widget, data, *args, **kwargs):
u"""Initialise widget and get base instance"""
super(PrependWidget, self).__init__(*args, **kwargs)
self.base_widget = base_widget(*args, **kwargs)
self.data = data
def render(self, name, value, attrs=None):
u"""Render base widget and add bootstrap spans"""
field = self.base_widget.render(name, value, attrs)
return mark_safe((
u'<div class="input-group mb-3">'
u' <div class="input-group-prepend">'
u' <span class="input-group-text" id="basic-addon1">%(data)s</span>'
u' </div>'
u' <input type="text" class="form-control" placeholder="Username" aria-label="Username" aria-describedby="basic-addon1">'
u'</div>'
) % {'field': field, 'data': self.data})
class MyForm(forms.Form):
example_field = forms.CharField(max_length=255, min_length=1, label='', required=False,
widget=PrependWidget(base_widget=forms.TextInput, data='$'))
我目前正在通过以下方式呈现我的 Django 表单:
<form action="/student/" method="post">
{% csrf_token %}
{% bootstrap_form form %}
<input type="submit" value="Launch" class="btn btn-primary"/>
</form>
我有多个不同类型的字段,每个字段应用不同的东西,例如验证器和帮助文本。
我有两个字段想添加 bootstrap 跨度。我想在前面加上一个英镑符号的一个货币字段,以及一个我想附加一个百分比符号的百分比字段,我知道这可以使用 bootstrap 来完成,如下所示:
<div class="input-group">
<span class="input-group-addon">$</span>
<input type="text" class="form-control" placeholder="Price"/>
</div>
但要在我的 Django 模板中执行此操作,需要我将表单分解为特定字段并创建特定字段 html。如This question提出的解决方案。
我正在寻找的是一种在模型或模型形式中指定属性或 class 的方法,它仅适用于特定字段,但会像上面一样呈现它而不会中断填写表格。
谢谢。
信息: Bootstrap-4 Django-2.0.2 Python-3.6.1
在表单中您可以做什么:
from django.forms import TextInput, Textarea
class MyForm(modelForm):
class Meta:
widgets = {
"name": TextInput({"class": "form-control"}),
"comment": Textarea({"data-validation": "validate"}),
}
您可以在此 link 关于小部件的 django 文档中阅读有关小部件的信息并了解添加自定义属性的不同方法:https://docs.djangoproject.com/en/2.0/ref/forms/widgets/
您需要继承自Base Widget。如果您使用下面的模板,您可以轻松创建自定义 bootstrap 组。
在forms.py
from django import forms
from django.forms import Widget
from django.utils.safestring import mark_safe
class PrependWidget(Widget):
""" Widget that prepend boostrap-style span with data to specified base widget """
def __init__(self, base_widget, data, *args, **kwargs):
u"""Initialise widget and get base instance"""
super(PrependWidget, self).__init__(*args, **kwargs)
self.base_widget = base_widget(*args, **kwargs)
self.data = data
def render(self, name, value, attrs=None):
u"""Render base widget and add bootstrap spans"""
field = self.base_widget.render(name, value, attrs)
return mark_safe((
u'<div class="input-group mb-3">'
u' <div class="input-group-prepend">'
u' <span class="input-group-text" id="basic-addon1">%(data)s</span>'
u' </div>'
u' <input type="text" class="form-control" placeholder="Username" aria-label="Username" aria-describedby="basic-addon1">'
u'</div>'
) % {'field': field, 'data': self.data})
class MyForm(forms.Form):
example_field = forms.CharField(max_length=255, min_length=1, label='', required=False,
widget=PrependWidget(base_widget=forms.TextInput, data='$'))