在wagtail页面中使用django表单时,如何处理request.method == 'POST'?

Whne Using django forms in wagtail Page, how to handle request.method == 'POST'?

当用户提交表单时,我无法处理请求。

我正在主页 get_context() 方法中呈现我的表单 class:

def get_context(self, request):
    context = super(HomePage, self).get_context(request)

    from .forms import RosaleaContactForm
    if request.method == 'POST':
        form = RosaleaContactForm(request.POST)
        if form.is_valid():
            subject = request.POST['subject']
            name = request.POST['from_name']
            message = request.POST['message']
            to_email = request.POST['from_email']
            from_phone = request.POST['from_phone']

            send_mail(
                subject,
                name,
                message,
                from_email,
                [to_email],
                fail_silently=False,
            )

            form = form
    else:
        form = RosaleaContactForm()

    context['form'] = form
    return context

表单在页面中呈现,我使用的是 crispy 表单,re_captcha但是在提交表单时我无法处理请求。

  1. 我需要一个新视图来处理请求吗?
  2. 我使用服务方法吗?
  3. 提交表单 AJAX?

如果我想将表单放在单独的页面上,我正在使用 serve 方法,这一切都有效,但 serve 覆盖了所有内容,我无法使用我的主页模板。

您应该覆盖页面的 serve 方法。这是 Wagtail 中最接近 Django 视图函数的等效项,因为它允许您 return 任何您喜欢的 HTTP 响应,具体取决于您的表单处理的结果 - 呈现模板(最容易使用 Django 的 django.shortcuts.render 助手) 或其他内容,例如重定向。

有关将 Django 表单实现为 ​​Wagtail 页面的有效示例,请参阅 wagtail-form-example

来自 gasman 的回答: 有效。

def serve(self, request):
        from flavours.forms import FlavourSuggestionForm

        if request.method == 'POST':
            form = FlavourSuggestionForm(request.POST)
            if form.is_valid():
                flavour = form.save()
                return render(request, 'flavours/thankyou.html', {
                    'page': self,
                    'flavour': flavour,
                })
        else:
            form = FlavourSuggestionForm()

        return render(request, 'flavours/suggest.html', {
            'page': self,
            'form': form,
        })