Django redirect重定向传递Id及Context上下文的实现方案
核心原因
redirect() 的作用是返回HTTP 302重定向响应,仅告知浏览器跳转到指定新URL,本身不支持携带渲染模板所需的context上下文。你写的return redirect('home',id,context)本身不符合redirect的参数定义,而且这行代码写在第一个redirect的return之后,永远不会被执行。
可行实现方案
方案1:在目标视图直接查询上下文数据(最推荐,符合Django开发规范)
这是Django开发的标准写法:重定向逻辑只负责路由跳转,页面需要的模型数据直接由绑定该路由的视图查询、组装后传给模板,完全没必要在登录视图里提前查询数据跨视图传递。
代码修改示例:
- 简化登录视图逻辑,去掉提前查询Posts的冗余代码,登录成功直接跳转即可
from django.contrib.auth import authenticate,login,logout from django.contrib import messages from django.shortcuts import redirect, render from .models import users from home.models import Posts def f1(request): if request.method == "POST": username = request.POST['username'] password = request.POST['password'] uz = authenticate(request,username=username, password=password) if uz is not None: login(request,uz) # 原代码单独查id的逻辑多余,authenticate返回的用户对象直接带id属性 return redirect('home', uz.id) else: messages.error(request,"Wrong Credentials") return render(request,'login.html')
- 在home路由绑定的
func视图中查询需要的Posts数据,组装context传给模板
# 对应home路由的视图 def func(request, users_id): # 可额外加校验逻辑,判断当前登录用户id和路由里的users_id是否一致,防止越权访问 post_list = Posts.objects.all() context = {'Post': post_list} return render(request, 'home.html', context)
额外提示:跨视图传递大块QuerySet数据会增加代码耦合度,还会带来不必要的序列化开销,非特殊情况不要这么做。
方案2:用messages框架传递临时文本类数据
如果你只需要在跳转后传递少量提示类文本(比如登录成功提示),可以直接用你已经导入的Django messages框架,注意这个方法不适合传递Posts这类模型集合数据:
# 登录视图中登录成功后加消息 if uz is not None: login(request,uz) messages.success(request, "登录成功") return redirect('home', uz.id)
目标页面的模板里直接遍历messages标签就能显示对应内容,不需要额外在视图里传值。
方案3:用session临时存储数据
如果确实需要跨重定向传递少量非文本临时数据,可以把数据存在session中,目标视图取到数据后立刻删除,避免session冗余,同样不推荐存大量QuerySet数据:
# 登录视图中存数据 if uz is not None: login(request,uz) # 注意QuerySet不能直接存session,需要转成可序列化的结构 request.session['temp_posts'] = list(Posts.objects.all().values()) return redirect('home', uz.id) # 目标home视图取数据 def func(request, users_id): # pop取完直接删除session里的临时数据 post_data = request.session.pop('temp_posts', None) context = {'Post': post_data} return render(request, 'home.html', context)
内容的提问来源于stack exchange,提问作者Shahid Fahad
相关产品推荐
相关产品推荐

