【问题标题】:Insert Header in Django form在 Django 表单中插入标题
【发布时间】:2011-12-05 11:44:45
【问题描述】:

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

Name
Price

Optional - Size
Optional - Color

但不是在每个可选项目中都有“可选 - ”,我想要一个标题,所以表单看起来像这样:

Name
Example

Optional fields:
Size
Color

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

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

谢谢

【问题讨论】:

标签: python django django-forms


【解决方案1】:

好吧,由于没有更好的选择,我通过渲染表单的各个字段而不是整个表单来解决这个问题。

那我只需要做:

<div class="fieldWrapper">
    (...Field 1...)
</div>

<h1>My Own Header</h1>

<div class="fieldWrapper">
    (...Field 2...)
</div>

【讨论】:

    【解决方案2】:

    我是用 JQuery 做的。 很简单。

    $('#id_size').parent().parent().before('<h1>optional</h1>');
    

    【讨论】:

      【解决方案3】:

      我认为 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)
      

      【讨论】:

      • 使用 Django 提供的表单和表单字段的当前行为,几乎不可能配置表单对象以根据需要自定义表单呈现。 django-uni-form, otoh,让这一切瞬间成为可能。
      【解决方案4】:

      相当过时的帖子,但我花了几个小时寻找解决方案,所以我想分享它。希望它有用。

      在您的应用程序目录中创建一个名为 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-11
        • 2011-09-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-22
        相关资源
        最近更新 更多