如何将 formbuilder 制作的表单添加到 Wagtail 中的每个页面?
How can I add a form made by formbuilder to every page in 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()
这就是我在 base.html 中使用它的方式:
{% get_feedback_form as feedback_form %}
...
{{ feedback_form.specific.title }} <-- this works
{{ feedback_form.specific.form.as_p }} <-- this doesnt work
以某种方式创建表单作为片段或将其添加到网站设置会很好,但我没有找到如何做。
主要问题是如何使用 .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
下面是完整的详细示例,以及如何将表单选择应用到站点设置模块中。
Link 到站点设置中的表单
假设您指的是站点设置贡献模块:
http://docs.wagtail.io/en/v1.13/reference/contrib/settings.html
文档的 'Edit Handlers' 部分解释了 link 到站点设置中的页面的好方法。
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']),
]
设置此模型后,您需要执行 makemigration
和 migrate
才能使更改在管理员中生效。然后您将在设置菜单中看到一个名为 'My Custom Settings'
的子菜单
向每个页面添加 linked 表单
添加一个包含在您的基本模板中的块(以便它可以在模板中被覆盖)(例如 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}
这在 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
,尽管我不确定这是否真的有必要。
有什么方法可以在 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
以某种方式创建表单作为片段或将其添加到网站设置会很好,但我没有找到如何做。
主要问题是如何使用 .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
下面是完整的详细示例,以及如何将表单选择应用到站点设置模块中。
Link 到站点设置中的表单
假设您指的是站点设置贡献模块: http://docs.wagtail.io/en/v1.13/reference/contrib/settings.html
文档的 'Edit Handlers' 部分解释了 link 到站点设置中的页面的好方法。 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']),
]
设置此模型后,您需要执行 makemigration
和 migrate
才能使更改在管理员中生效。然后您将在设置菜单中看到一个名为 'My Custom Settings'
向每个页面添加 linked 表单
添加一个包含在您的基本模板中的块(以便它可以在模板中被覆盖)(例如 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}
这在 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
,尽管我不确定这是否真的有必要。