相当过时的帖子,但我花了几个小时寻找解决方案,所以我想分享它。希望它有用。
在您的应用程序目录中创建一个名为 widgets.py 的文件,其中包含以下内容,以扩展 Django 的基本 Widget 类:
# widgets.py
from django.forms.widgets import Widget
from django.utils.translation import ugettext_lazy as _
from django.template.loader import render_to_string
class HeaderWidget(Widget):
def __init__(self, attrs=None, label=None, tag='h1'):
self.label = label
self.tag = tag
super(HeaderWidget, self).__init__(attrs)
def render(self, name, value, attrs=None):
# change blocks/ according to your template path. In this case was templates/block
widget = render_to_string("blocks/header-form-field.html", {
'tag' : self.tag,
'label' : self.label,
})
return widget
然后创建一个文件 customfileds.py 。在这里,我们几乎什么都没有扩展 Field 类。重要的是要避免字段验证,因为我们没有输入。
from django import forms
from django.forms.fields import Field
from . import widgets
class HeaderField(Field):
widget = widgets.HeaderWidget
# This is to avoid validation
validators = []
def __init__(self, **kwargs):
super().__init__(**kwargs)
def clean(self, value=''):
"""
It seem the clean method in mandatory when creating a Field class.
Jaust return value without validation
"""
return value
然后创建 html 模板。将其放在与您的
匹配的路径中
小部件 = render_to_string("blocks/header-form-field.html"
#header-form-field.html
<{{ tag }} class="your-custom-class">{{ label }}</{{ tag }}>
现在您可以将所需的任何 HeaderField 添加到表单中,如下所示:
class MyForm(GenericForm):
header1 = customfileds.HeaderField(label=_(""),required=False,label_suffix='',
widget=widgets.HeaderWidget(label=_("My custom Label text here"),tag="h3"))
field 1 = whatever input field you have...
在这里您可以在 Gita 页面中找到相同的代码
https://gitlab.com/MaadiX/header-field-for-django-forms/blob/master/README.md