我想知道是否有可能从抽象的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
答案 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 %}
放在此处会使其返回到首页,并且首页不知道如何处理表单提交。同样,用于显示验证错误消息的代码也可以从主页模板中删除-如果用户提交了无效的表单,则会将其放置在“与我们联系”页面而非首页上。