如何使用django redirect函数传递上下文数据?

lhcgjxsq  于 2023-05-19  发布在  Go
关注(0)|答案(5)|浏览(190)

我有重定向到URL的功能。

return redirect('/orders')

URL /orders有一些正在传递给它的上下文数据。我想在视图中传递一些额外的数据沿着来自URL函数的数据,如:

return redirect('/orders', {'message':'some_message'})

我试着这样根据文档:

return redirect('/orders', message='some_message')

但它没有将任何数据传递回html。那么如何通过重定向来传递数据呢?

62o28rlo

62o28rlo1#

如果它只是一个小项目,如?status=2,它可以以通常的方式添加到URL。(小旁:小心,它可能会对搜索引擎如何蜘蛛你的网站产生负面影响,即。创建重复内容问题)
然而,对于您的示例,将整个“message”字符串传递到下一页,我建议使用与Django's Messages framework相同的方式:使用Django's Session engine

yqkkidmi

yqkkidmi2#

您可以使用request.session[“key”]进行session重定向,如下图所示:

# "views.py"

from django.shortcuts import redirect

def my_view(request): 
            # Here
    request.session["message"] = "some_message"
    return redirect('/orders')
# "index.html"

{{ request.session.message }} {# some_message #}
bksxznpy

bksxznpy3#

也许有点盗版,但适用于我的用例。使用session,但进行了更改。重定向完成后,会话将被删除,变量将作为上下文传递给模板。

class OAuthLoginErrorView(socialaccount_views.LoginErrorView):
    def get(self, request):
        request.session["error_login_error"] = True
        return redirect(reverse("account_login"))
class LoginView(allauth_views.LoginView):
    def get(self, request):
        errors = list(filter(lambda arg: arg.startswith("error_"), request.session.keys()))
        if errors:
            for error in errors:
                del request.session[error]

            return render(
                request,
                self.template_name,
                context={
                    **self.template_settings,
                    **{error: True for error in errors},
                },
            )

        return super().get(request)
{% if error_login_error %}
    <div class="text-sm text-red-500 font-center">There was an error logging-in.</div>
{% endif %}

我需要的东西。

lf5gs5x2

lf5gs5x24#

如果你使用http redirect(你提到的例子),你需要通过url的查询字符串传递参数:

redirect('/orders?message=some_message')

另一种方法是使用自定义参数调用其他视图,这通常不建议使用。
编辑:您还可以使用django.sessions来创建基于请求的集中消息传递。

iibxawm4

iibxawm45#

我的意思是你总是可以使用get_context_data方法来做到这一点。此方法将始终将数据从视图发送到模板。

相关问题