【问题标题】:Query Wagtail Form Fields into Homepage在主页中查询 Wagtail 表单字段
【发布时间】:2018-09-28 23:47:26
【问题描述】:

我想知道是否可以从抽象的 wagtail 表单查询表单字段到页面模型中。我想在我的主页(页面)模型上放一个鹡鸰形式,但如果可能的话,我真的不明白你将如何做到这一点。

感谢任何反馈

home_page.html

  ...
  <form action="{% pageurl page %}" method="POST">
          {% csrf_token %}
      <div class="row">
        <div class="col-md-12 col-sm-12">

        {% if form.non_field_errors %}
            <div class="alert alert-danger" role="alert">
              {% for error in form.non_field_errors %}
                {{ error }}
              {% endfor %}
            </div>
              {% endif %}

        <h3>Contact Form</h3><br>
        </div>

       {% for item in page.formPage.all %}
        {% for field in form.visible_fields %}
        <div class="col-md-6 col-sm-12">
          <div class="form-group">
            {% render_field field class+="form-control" %}
          </div>
        </div>
        {% endfor %}
      {% endfor %}
        </div>
        <div class="pull-center">
          <button type="submit" class="btn btn-contact mt-3">Submit</button>
        </div>
    </form>

models.py

imports removed

class HomePage(Page):
    firstheader = RichTextField(blank=True)
    firstbody = RichTextField(blank=True)
    registerbuttonurl = models.CharField(blank=True, max_length=250)
    secondheader = RichTextField(blank=True)
    secondbody = RichTextField(blank=True)
    registerlink = RichTextField(blank=True)

    def Form(self):
        return FormPage.objects.all()

    content_panels = Page.content_panels + [

        FieldPanel('firstheader', classname="full"),
        FieldPanel('firstbody', classname="full"),
        FieldPanel('registerbuttonurl'),
        FieldPanel('secondheader', classname="full"),
        FieldPanel('secondbody', classname="full"),
        FieldPanel('registerlink', classname="full"),
        InlinePanel('gallery_images', label="Certified Distributor Logos"),
    ]



class FormField(AbstractFormField):
    page = ParentalKey('FormPage', on_delete=models.CASCADE, related_name='form_fields')


class FormPage(AbstractEmailForm):
    intro = RichTextField(blank=True)
    thank_you_text = RichTextField(blank=True)

    content_panels = AbstractEmailForm.content_panels + [
        FieldPanel('intro', classname="full"),
        InlinePanel('form_fields', label="Form fields"),
        FieldPanel('thank_you_text', classname="full"),
        MultiFieldPanel([
            FieldRowPanel([
                FieldPanel('from_address', classname="col6"),
                FieldPanel('to_address', classname="col6"),
            ]),
            FieldPanel('subject'),
        ], "Email"),
    ]


    thank_you_page = models.ForeignKey(
        'wagtailcore.Page',
        null=True,
        blank=True,
        on_delete=models.SET_NULL,
        related_name='+',
    )

    def render_landing_page(self, request, form_submission=None, *args, **kwargs):
        ...removed

【问题讨论】:

  • “将表单字段查询到页面模型中”是什么意思?您的意思是要根据表单字段的内容创建一个新页面吗?是否要对之前的表单提交进行查询并在页面上显示输出?或者您只是想在页面上显示表单 - 在这种情况下,您能告诉我们您现有代码中目前哪些地方不起作用吗?
  • 我在models.py中使用了“def Form(self): return FormPage.objects.all()”来查询formfields。我有一个 FormPage (AbstractEmailForm) 和 FormField(AbstractFormField),我希望可见的表单字段出现在我的 HomePage(Page) 上。

标签: django wagtail


【解决方案1】:

return FormPage.objects.all() 不起作用,因为表单字段是在您在管理员中创建的一个特定 FormPage 实例上定义的,而不是在 FormPage 类本身上定义的。您需要在代码中添加一些内容来识别您指的是哪个 FormPage - 我建议给它一个唯一的 slug(在此示例中为 contact-us)并据此检索它。

class HomePage(Page):
    # ...
    def get_contact_form_page(self):
        return FormPage.objects.get(slug='contact-us')

    def get_contact_form(self):
        return self.get_contact_form_page().get_form()

然后,在您的主页模板上,您可以访问page.get_contact_form 并以与在FormPage 自己的模板上呈现结果相同的方式呈现结果表单:

{% with page.get_contact_form as form %}
    <form action="{% pageurl page.get_contact_form_page %}" method="POST">
        {% csrf_token %}
        {% for field in form.visible_fields %}
            ...
        {% endfor %}
    </form>
{% endwith %}

请注意,表单操作设置为发布到表单页面;将{% pageurl page %}放在这里会导致它返回首页,首页不知道如何处理表单提交。同样,用于显示验证错误消息的代码可以从主页模板中省略 - 如果用户提交无效的表单,它们将被放到联系我们页面而不是主页上。

【讨论】:

    猜你喜欢
    • 2018-12-31
    • 2018-07-04
    • 2019-10-22
    • 2013-09-29
    • 1970-01-01
    • 1970-01-01
    • 2016-08-31
    • 2016-12-20
    • 1970-01-01
    相关资源
    最近更新 更多