Django是否覆盖表单HTML标签模板?
在my settings.py中,我设置了Django是否覆盖表单HTML标签模板?,django,django-forms,django-templates,Django,Django Forms,Django Templates,在my settings.py中,我设置了 FORM_RENDERER = 'django.forms.renderers.TemplatesSetting' 现在,我可以在中添加我自己的模板: <project>/templates/django/forms/widgets/ 上面的表单将呈现如下标签: <label for="id_first_name">First name:</label> 名字: 我想以不同的方式渲染标签。因此,我认为添加一个
FORM_RENDERER = 'django.forms.renderers.TemplatesSetting'
现在,我可以在中添加我自己的模板:
<project>/templates/django/forms/widgets/
上面的表单将呈现如下标签:
<label for="id_first_name">First name:</label>
名字:
我想以不同的方式渲染标签。因此,我认为添加一个html标签模板会很容易:templates/django/forms/widgets/label.html
这个不起作用。正在浏览Django文档,但我找不到如何对标签执行此操作。显然,标签不是小部件
我的问题是,在哪里/如何更改默认标签?实际上可以覆盖Django中的现有表单小部件 首先,您需要将
'django.forms'
添加到您的已安装的应用程序中
,以将其视为一个应用程序
INSTALLED_APPS = [
...
"django.forms",
...
]
然后将表单渲染器
附加到您的设置.py
FORM_RENDERER = 'django.forms.renderers.TemplatesSetting'
from django import forms
from myapp.base_form import CustomLabelForm
class TestForm(CustomLabelForm):
first_name = forms.CharField(label="First name", max_length=50)
last_name = forms.CharField(label="Last name")
nick_name = forms.CharField(required=False)
更多关于的信息可以在Django文档中找到
之后,将您想要覆盖的任何小部件文件从django/forms/widgets/
文件夹复制到您自己的projectname/templates/django/forms/widgets
文件夹中。定制离开
我希望这能有所帮助。这里有一个可行的解决方案(在Django 3.1上测试): 创建Django表单的子类,并将
LABEL\u TEMPLATE
设置为所需的模板
myapp/base\u form.py
FORM_RENDERER = 'django.forms.renderers.TemplatesSetting'
from django import forms
from myapp.base_form import CustomLabelForm
class TestForm(CustomLabelForm):
first_name = forms.CharField(label="First name", max_length=50)
last_name = forms.CharField(label="Last name")
nick_name = forms.CharField(required=False)
来自django导入表单的
从django.forms.utils导入flatatt
从django.utils.html导入条件转义,格式化html
从django.utils.safestring导入标记_safe
从django.utils.translation导入gettext\u lazy作为_
LABEL_TEMPLATE='{}'
类CustomLabelBoundField(forms.boundfield.boundfield):
def label_标签(自身,内容=None,属性=None,标签后缀=None):
"""
如果字段具有ID属性,则将给定内容包装在中。
内容应标记为“安全”,以避免HTML转义。如果
如果未给定,请使用字段的HTML转义标签。
如果给定了属性,则将它们用作标记上的HTML属性。
label_后缀覆盖表单的label_后缀。
"""
内容=内容或自我标签
如果标签后缀为“无”:
label\u suffix=(如果self.field.label\u suffix不是None,则self.field.label\u suffix
else self.form.label(后缀)
#仅在标签不以标点符号结尾时添加后缀。
#翻译人员:如果找到最后一个标签字符,这些标点符号
#字符将阻止将默认标签后缀附加到标签
如果标签_后缀和内容与内容[-1]不在u(':?.!'):
contents=format_html('{}{}',contents,label_后缀)
widget=self.field.widget
id=widget.attrs.get('id')或self.auto\u id
如果id u3;:
id_for_label=widget.id_for_label(id_)
如果标签的id为:
attrs={**(attrs或{}),'for':id_for_label}
如果self.field.required和hasattr(self.form,“required\u css\u class”):
attrs=attrs或{}
如果属性中有“类”:
属性['class']+=''+self.form.required\u css\u类
其他:
attrs['class']=self.form.required\u css\u类
ATTR=如果ATTR else'',则为扁平ATT(ATTR)
内容=格式\u html(标签\u模板、属性、内容)
其他:
contents=条件转义(contents)
返回标记_安全(内容)
def get_bound_字段(字段、表单、字段名称):
"""
返回访问表单时将使用的BoundField实例
模板中的字段。
"""
返回CustomLabelBoundField(表单、字段、字段名称)
类CustomLabelForm(forms.Form):
def uu getitem uu(self,name):
“”“返回具有给定名称的边界字段。”“”
尝试:
field=self.fields[name]
除KeyError外:
上升键错误(
“在'%s'中找不到键'%s'。选项为:%s.%”(
名称
self.\uuuuu类\uuuuuuu名\uuuuuuuuu,
“,”.join(已排序(self.fields)),
)
)
如果名称不在self.\u绑定\u字段\u缓存中:
self.\u-bound\u-fields\u-cache[name]=获取\u-bound\u-field(field,self,name)
返回self.\u绑定\u字段\u缓存[名称]
并从CustomLabelForm
继承您的表单:
myapp/forms.py
FORM_RENDERER = 'django.forms.renderers.TemplatesSetting'
from django import forms
from myapp.base_form import CustomLabelForm
class TestForm(CustomLabelForm):
first_name = forms.CharField(label="First name", max_length=50)
last_name = forms.CharField(label="Last name")
nick_name = forms.CharField(required=False)
这将生成
名字:
您可以覆盖表单的\u init\u()
方法:
def __init__(self, *args, **kwargs):
self.fields['field_name'].label = 'Your new label here'
当它只是你想要设置样式的标签时,你可以进入CSS并编写
label{width:200px;…}
当你想要正确设置表单样式时,我建议使用小部件调整。它是Django表单最独立的样式选项,因为您可以在每个表单属性上使用纯css。请看我的答案@Hanseffranz谢谢。但我不是在设计样式,我想重写标签。例如,不是一个标签,而是一个标签。您认为标签不是小部件是正确的。标记是在boundfield对象的方法中创建的。覆盖标签并不是那么简单。我也有同样的问题。