首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何将form by制作的表单添加到Wagtail中的每个页面?

如何将form by制作的表单添加到Wagtail中的每个页面?
EN

Stack Overflow用户
提问于 2017-03-08 21:53:45
回答 2查看 2.3K关注 0票数 1

有没有办法将表单(例如反馈表单)添加到CMS中的每个页面?我真的很喜欢使用Wagtail FormBuilder,这样编辑器就可以改变字段了。

我的第一个想法是创建自定义表单页面(继承自AbstractEmailForm)作为站点根子页面,并通过模板标记将其加载到base.html。我可以通过这种方式访问页面属性,但不能呈现表单。

下面是我的模板标签:

代码语言:javascript
复制
@register.assignment_tag(takes_context=True)
def get_feedback_form(context):
  return context['request'].site.root_page.get_children().type(FeedbackFormPage).first()

下面是我在base.html中使用它的方式:

代码语言:javascript
复制
{% get_feedback_form as feedback_form %}
...
{{ feedback_form.specific.title }} <-- this works
{{ feedback_form.specific.form.as_p }} <-- this doesnt work

以某种方式创建一个表单作为代码片段或将其添加到站点设置中会很好,但我不知道如何做到这一点。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-10 09:53:22

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

您将需要使用.get_form函数生成表单,但最好在模板中完成,因为当前用户和页面需要作为参数传入,如下所示。

代码语言:javascript
复制
        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

完整的详细示例如下,以及如何将表单选择工作到站点设置模块中。

链接到网站设置中的表单

假设您指的是站点设置contrib模块: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中):

代码语言:javascript
复制
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/template/base.html)。

代码语言:javascript
复制
<!-- Footer -->
<footer>
    {% block feedback_form %}{% include "includes/feedback_form.html" %}{% endblock feedback_form %}
    {% include "includes/footer.html" %}
</footer>

创建包含模板(例如,myapp/template/includes/feedback_form.html)

代码语言:javascript
复制
{% 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)

代码语言:javascript
复制
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}
票数 6
EN

Stack Overflow用户

发布于 2018-12-11 08:09:33

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

代码语言:javascript
复制
@register.assignment_tag(takes_context=True)

使用

代码语言:javascript
复制
@register.simple_tag(takes_context=True) to conform with django 2.2

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42673180

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档