Django是否覆盖表单HTML标签模板?

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> 名字: 我想以不同的方式渲染标签。因此,我认为添加一个

在my settings.py中,我设置了

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对象的方法中创建的。覆盖标签并不是那么简单。我也有同样的问题。