W W不通过自定义现场面板

时间:2017-07-20 11:09:50

标签: django forms wagtail

我通过以下方式覆盖了w panel ... before_input = RichTextField(verbose_name=_('before input'), blank=True) after_input = RichTextField(verbose_name=_('after input'), blank=True) panels = [ FieldPanel('label'), FieldPanel('before_input'), FieldPanel('after_input'), FieldPanel('required'), FieldPanel('field_type', classname="formbuilder-type"), FieldPanel('choices', classname="formbuilder-choices"), FieldPanel('default_value', classname="formbuilder-default"), ] 属性:

<form action="{% pageurl page %}" method="POST" class="lm-ls1" id="feedback-form">
  {% csrf_token %}

  {{ form.question1.help_text }} <!-- Simpler non interable way -->
  {{ form.question1.before_input }}

  <p>---------------</p>
  {% for row in form.fields.values %}
    {{row.choices}}
    <p>---------------</p>
    {{row.help_text}}
    <p>---------------</p>
    {{row.before_input}}
  {% endfor %}
</form>

其他面板是开箱即用的。

这在管理员方面完美运行,并且还将富文本另存为我的数据库

我通过以下方式将此内容传递到我的模板中:

before_input

但我只获取表单面板的html输出,不包括after_inputOverall, how did you feel about the service you received today? --------------- [('Very satisfied', 'Very satisfied'), ('Satisfied', 'Satisfied'), ('Neither satisfied nor dissatisfied', 'Neither satisfied nor dissatisfied'), ('Dissatisfied', 'Dissatisfied'), ('Very dissatisfied', 'Very dissatisfied')] --------------- Overall, how did you feel about the service you received today? --------------- ---------------

我正在大致通过以下内容:

before_input

如何访问存储在_formfield wagtail表中的{{1}}字段面板数据?

1 个答案:

答案 0 :(得分:1)

有点迟,但希望这仍然可以帮助你或其他人。

Wagtail Forms如何工作

提供给AbstractFormPage模型的视图上下文的Wagtail表单是一个完全实例化的Django表单。这意味着您只能在form中找到可以提供给Django表单的值。

这包括字段,它们是Django Fields的实例(例如CharField),并且没有简单的方法可以为这些字段添加其他属性。

您可以在Wagtail FormBuilder类定义中看到Form对象的构建方式。

1 - 制作自定义模板标签

在FormField(Wagtail的FormField)上获取其他属性的一种简单方法是使用模板标记。

在应用中的templatetags文件夹中创建一个新文件,然后构建一个simple_tag,它将获取form_page,字段(将是Django Field实例)和字符串你想要获得的属性名称。

# myapp/templatetags/form_tags.py
from django import template
from django.utils.html import mark_safe

register = template.Library()


@register.simple_tag(name='form_field_attribute')
def form_field_attribute(form_page, field, attribute_name, default=None):
    """Return attribute on FormField where field matches 'field' provided."""
    # field is a django Field instance
    field_name = field.name
    results = [
        # if html is stored, need to use mark_safe - be careful though.
        mark_safe(getattr(form_field, attribute_name, default))
        # get_form_fields() is a built in function on AbstractFormPage
        for form_field in form_page.get_form_fields()
        # clean_name is property on AbstractFormField used for Django Field name
        if form_field.clean_name == field_name]
    if results:
        return results[0]
    return default

2 - 修改您的form_page.html模板

在模板中,遍历表单(这是Django Form实例)并使用模板助手为您提供所需的额外属性。传递pageself的示例与您FormPage的实例相同。

<form action="{% pageurl page %}" method="POST" role="form">
    {% csrf_token %}
    {% for field in form %}
      <div>{% form_field_attribute page field 'before_input' %}</div>
      {{ field }}
      <div>{% form_field_attribute page field 'after_input' %}</div>
    {% endfor %}
    <input type="submit">
</form>