【问题标题】:How can I add a form made by formbuilder to every page in Wagtail?如何将 formbuilder 制作的表单添加到 Wagtail 的每个页面?
【发布时间】:2017-03-08 13:53:45
【问题描述】:

有没有办法在 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()

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

{% get_feedback_form as feedback_form %}
...
{{ feedback_form.specific.title }} <-- this works
{{ feedback_form.specific.form.as_p }} <-- this doesnt work

以某种方式创建一个表单作为 sn-p 或将其添加到站点设置会很好,但我没有找到如何做到这一点。

【问题讨论】:

    标签: python django django-forms wagtail


    【解决方案1】:

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

    您需要使用 .get_form 函数生成表单,但您最好在模板中执行此操作,因为当前用户和页面需要像这样的参数传入。

            form = feedback_form_page.get_form(
            page=feedback_form_page, user=request.user)
    

    您可以在此处查看如何为 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/en/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']),
        ]
    

    设置此模型后,您需要执行 makemigrationmigrate 以使更改在管理员中生效。然后,您将在设置菜单中看到一个名为“我的自定义设置”的子菜单

    为每个页面添加链接表单

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

    <!-- Footer -->
    <footer>
        {% block feedback_form %}{% include "includes/feedback_form.html" %}{% endblock feedback_form %}
        {% include "includes/footer.html" %}
    </footer>
    

    创建一个包含模板(例如 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>
    

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

    您的模板标签需要使用页面的 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}
    

    【讨论】:

    • 感谢您提供详细的回答!
    【解决方案2】:

    这在 wagtail 2.3 中仍然有效,只需要替换

    @register.assignment_tag(takes_context=True)
    

    @register.simple_tag(takes_context=True) to conform with django 2.2
    

    另外{% load feedback_form_tags wagtailcore_tags %} 假定模板标签内的文件名为feedback_form_tags.py。我还在模板标签文件夹中添加了一个__init__.py,尽管我不确定这是否真的有必要。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-07
      • 1970-01-01
      • 2018-07-18
      相关资源
      最近更新 更多