以Django形式插入标题

时间:2011-12-05 11:44:45

标签: python django django-forms

我想在Django表单中插入一个标头。我有以下字段:

Name
Price

Optional - Size
Optional - Color

但是我没有在每个可选项中使用“Optional - ”,而是想要一个标题,所以表单看起来像这样:

Name
Example

Optional fields:
Size
Color

(这是伪代码,但应该很容易说明我的观点)

我知道我可以在HTML中渲染每个单独的表单字段,但我仍然想使用{{form.as_p}}(所以我不必为每个要添加的新字段更改标记)。有没有办法为表单定义一个Django属性,所以我可以保留form.as_p并仍然有这个额外的标题(更多的标题用于更多的字段)?

谢谢

4 个答案:

答案 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