将Wagtail表单字段查询到主页

时间:2018-09-28 23:47:27

标签: django wagtail

我想知道是否有可能从抽象的w形式到页面模型中查询形式字段。我想在首页(page)模型上放一个w形的表格,但是,即使有可能,我也不是很了解如何实现。

感谢任何反馈

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

1 个答案:

答案 0 :(得分:3)

return FormPage.objects.all()无法使用,因为表单字段是在您在管理员中创建的一个特定FormPage实例上定义的,而不是在FormPage类本身上定义的。您需要代码中的某些内容来标识您所指的FormPage-我建议给它一个唯一的标记(在本示例中为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 %}放在此处会使其返回到首页,并且首页不知道如何处理表单提交。同样,用于显示验证错误消息的代码也可以从主页模板中删除-如果用户提交了无效的表单,则会将其放置在“与我们联系”页面而非首页上。