如何在Wagtail的每个页面中添加由formbuilder制作的表单?

ale*_*.cz 0 python django django-forms wagtail

有什么方法可以向CMS中的每个页面添加表单(例如反馈表单)?我真的很喜欢使用Wagtail FormBuilder,以便编辑人员可以更改字段。

我的第一个想法是创建自定义表单页面(从AbstractEmailForm继承)作为网站根目录子代并将其加载到base.html槽模板标记。我可以通过这种方式访问​​页面属性,但无法渲染表单。

这是我的模板标签:

@register.assignment_tag(takes_context=True)
def get_feedback_form(context):
  return context['request'].site.root_page.get_children().type(FeedbackFormPage).first()
Run Code Online (Sandbox Code Playgroud)

这就是我从base.html使用它的方式:

{% get_feedback_form as feedback_form %}
...
{{ feedback_form.specific.title }} <-- this works
{{ feedback_form.specific.form.as_p }} <-- this doesnt work
Run Code Online (Sandbox Code Playgroud)

以某种方式将表单创建为片段或将其添加到“网站设置”会很好,但是我没有找到执行该操作的方法。

LB *_*ton 5

主要问题是如何使用来在模板中生成表单.form.as_p

您将需要使用.get_form函数生成表单,但是最好在模板中完成该表单,因为当前用户和页面都需要像这样的参数插入。

        form = feedback_form_page.get_form(
        page=feedback_form_page, user=request.user)
Run Code Online (Sandbox Code Playgroud)

您可以在此处查看如何为AbstractForm模型构建表单:https : //github.com/wagtail/wagtail/blob/master/wagtail/wagtailforms/models.py#L278

以下是完整的示例,以及如何在“网站设置”模块中进行表单选择。

链接到网站设置中的表单

假设您引用的是“网站设置”贡献模块:http : //docs.wagtail.io/en/v1.13/reference/contrib/settings.html

文档的“编辑处理程序”部分介绍了一种链接到网站设置内页面的好方法。 http://docs.wagtail.io/zh-CN/v1.13/reference/contrib/settings.html?highlight=site%20settings#edit-handlers

示例(在models.py中):

from wagtail.contrib.settings.models import BaseSetting, register_setting
# ...
@register_setting
class MyCustomSettings(BaseSetting):
    feedback_form_page = models.ForeignKey(
        'wagtailcore.Page', null=True, on_delete=models.SET_NULL)

    panels = [
        # note the page type declared within the pagechooserpanel
        PageChooserPanel('feedback_form_page', ['base.FormPage']),
    ]
Run Code Online (Sandbox Code Playgroud)

一旦您设置这种模式,你需要做的makemigration,并migrate在管理员修改工作。然后,您将在设置菜单中看到一个名为“我的自定义设置”的子菜单

将链接的表单添加到每个页面

添加一个包含在基本模板中的块(以便可以在模板中覆盖)(例如,myapp / templates / base.html)。

<!-- Footer -->
<footer>
    {% block feedback_form %}{% include "includes/feedback_form.html" %}{% endblock feedback_form %}
    {% include "includes/footer.html" %}
</footer>
Run Code Online (Sandbox Code Playgroud)

创建一个包含模板(例如myapp / templates / includes / feedback_form.html)

{% load feedback_form_tags wagtailcore_tags %}

{% get_feedback_form as feedback_form %}

<form action="{% pageurl feedback_form.page %}" method="POST" role="form">
  <h3>{{ feedback_form.page.title}}</h3>
  {% csrf_token %}
  {{ feedback_form.form.as_p }}
  <input type="submit">
</form>
Run Code Online (Sandbox Code Playgroud)

构建模板标签以获取表单和页面

您的模板标记需要使用页面的self.get_form()函数来构建表单。例如。您的模板标签(base / templatetags / feedback_form)

from django import template
from myapp.models import MyCustomSettings

register = template.Library()
# https://docs.djangoproject.com/en/1.9/howto/custom-template-tags/


@register.assignment_tag(takes_context=True)
def get_feedback_form(context):
    request = context['request']
    my_custom_settings = MyCustomSettings.for_site(request.site)
    feedback_form_page = my_custom_settings.feedback_form_page.specific
    form = feedback_form_page.get_form(
        page=feedback_form_page, user=request.user)
    return {'page': feedback_form_page, 'form': form}
Run Code Online (Sandbox Code Playgroud)