我想在Django表单中插入一个标头。我有以下字段:
Name
Price
Optional - Size
Optional - Color
但是我没有在每个可选项中使用“Optional - ”,而是想要一个标题,所以表单看起来像这样:
Name
Example
Optional fields:
Size
Color
(这是伪代码,但应该很容易说明我的观点)
我知道我可以在HTML中渲染每个单独的表单字段,但我仍然想使用{{form.as_p}}(所以我不必为每个要添加的新字段更改标记)。有没有办法为表单定义一个Django属性,所以我可以保留form.as_p并仍然有这个额外的标题(更多的标题用于更多的字段)?
谢谢
答案 0 :(得分:2)
我认为Django没有这样的功能,但django-uni-form有:)这是来自uni-form documentation的一个例子,只有很小的变化:
from uni_form.helper import FormHelper
from uni_form.layout import Layout, Fieldset
class ExampleForm(forms.Form):
[...]
def __init__(self, *args, **kwargs):
self.helper = FormHelper()
self.helper.layout = Layout(
Fieldset(
'name',
'price'
),
Fieldset(
'Optional',
'size',
'color'
),
ButtonHolder(
Submit('submit', 'Submit', css_class='button white')
)
)
return super(ExampleForm, self).__init__(*args, **kwargs)
答案 1 :(得分:2)
好吧,由于缺乏更好的选择,我通过渲染表单的各个字段而不是整个表单来解决这个问题。
然后我只需要这样做:
<div class="fieldWrapper">
(...Field 1...)
</div>
<h1>My Own Header</h1>
<div class="fieldWrapper">
(...Field 2...)
</div>
答案 2 :(得分:1)
我用JQuery制作了它。 这很简单。
$('#id_size').parent().parent().before('<h1>optional</h1>');
答案 3 :(得分:0)
一个过时的帖子,但是我花了几个小时来寻找解决方案,所以我想分享一下。希望它有用。
在您的apps目录中,创建一个名为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。在这里,我们几乎不扩展任何字段类。重要的是要避免现场验证,因为我们没有输入。
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