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

Hen*_*ynx 2 django-forms python-3.x wagtail

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

我在 HomePage 类的 get_context() 方法中呈现我的表单:

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
Run Code Online (Sandbox Code Playgroud)

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

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

如果我想将表单放在单独的页面上,我将使用 serve 方法,并且一切正常,但是 serve 会覆盖所有内容,并且我无法使用我的主页模板。

gas*_*man 6

您应该覆盖页面的serve方法。这是 Wagtail 中与 Django 的视图函数最接近的等价物,因为它允许您根据表单处理的结果返回您喜欢的任何 HTTP 响应 - 渲染模板(最容易使用 Django 的django.shortcuts.render帮助程序)或其他内容,例如重定向。

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


Hen*_*ynx 6

来自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,
        })
Run Code Online (Sandbox Code Playgroud)