【问题标题】:How do I use POST in django1.5 with TemplateView?如何在 django1.5 中使用 POST 和 TemplateView?
【发布时间】:2013-05-15 12:31:01
【问题描述】:

我正在尝试将我的应用程序从 django 1.4 移植到 1.5。我改变了所有出现的:

return direct_to_template(request, template)

到:

return TemplateView.as_view(template_name=template)(request)

这适用于我所有使用 GET 的表单,但对于我使用 POST 的表单,我最终会在浏览器上显示一个空白页面。任何地方都没有错误,只是一个空白页。

在 1.5 中,我用什么代替 direct_to_template 进行 POST?

【问题讨论】:

    标签: django


    【解决方案1】:

    有一个TemplateResponse 响应类,它采用与direct_to_template 快捷方式相同的参数。您可以更换并确保安全

    return TemplateResponse(request, template)
    

    【讨论】:

    • 谢谢!这对我有用。我也必须在我的上下文中通过。但是现在我遇到了 RedirectView 的问题。我已经用 RedirectView.as_view 替换了 1.4 次出现的 redirect_to,但它在 patch_vary_headers 中的 django/utils/cache.py 中爆炸了。似乎 RedirectView.as_view 没有返回 HttpResponse,而 redirect_to 则返回了。我很惊讶从 1.4 升级到 1.5 这么麻烦。
    • 试试 django.shortcuts.redirect
    • 我将其更改为使用 HttpResponseRedirect,这对我有用。
    【解决方案2】:

    render shortcut 可以用作 direct_to_template 的替代品。它采用与direct_to_template 相同的参数,因此可以进行简单的查找和替换。

    return direct_to_template(request, template)
    

    变成

    return render(request, template)
    

    【讨论】:

    • 渲染对我不起作用 - 我无法将上下文传递给它。我使用了 TemplateResponse,这很有效。
    • render 的第三个参数是上下文,默认使用RequestContext
    【解决方案3】:

    一般而言,您不必像那样显式返回 TemplateView,只需将其放在您的 url 中即可。

    现在,您没有收到 Post 响应的原因是 TemplateView 只定义了一个 GET 方法

    因此,您需要创建一个继承自 TemplateView 的新类,以便自己实现 POST 方法。

    我的建议是寻找另一个 CBV,看看是否有一个更符合您的需求,也许 FormView 就足够了

    https://github.com/django/django/blob/master/django/views/generic/base.py#L147

    【讨论】:

    • 这是一个巨大的应用程序,不是我写的,但我已经接管了维护。我不想为了从一个版本的 django 升级到另一个版本而完全重组它。
    猜你喜欢
    • 1970-01-01
    • 2011-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-27
    • 1970-01-01
    • 2014-10-09
    • 1970-01-01
    相关资源
    最近更新 更多