You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django中如何在视图函数间传递变量?

Django视图间用户信息传递解决方案

你的问题在于两个视图函数是独立处理HTTP请求的,signin里的uname是局部变量,仅在当前请求周期内有效,无法直接被reservations访问。下面是两种可行的解决方法,优先推荐使用Django官方认证系统:

方法一:使用Django自带认证系统(推荐)

这是处理用户登录的标准方式,安全且无需手动管理会话:

1. 完善signin视图,实现用户登录

from django.contrib.auth import authenticate, login
from django.shortcuts import redirect, render
from django.http import HttpResponse

def signin(request):
    if request.method == 'POST':
        uname = request.POST['username']
        pwd = request.POST['password']
        # 验证用户名和密码是否匹配
        user = authenticate(request, username=uname, password=pwd)
        if user is not None:
            # 登录用户,Django自动将用户信息存入session
            login(request, user)
            # 登录成功后跳转至预订页面
            return redirect('reservations')
        else:
            return HttpResponse('用户名或密码错误')
    # GET请求返回登录页面
    return render(request, 'signin.html')

2. 修改reservations视图,获取当前登录用户

from django.contrib.auth.decorators import login_required
from django.shortcuts import render
from django.http import HttpResponse
from .models import Reserve

# 装饰器确保只有登录用户能访问该视图
@login_required
def reservations(request):
    try:
        # request.user即为当前登录的用户对象
        reserve = Reserve.objects.get(client=request.user)
        return render(request, 'reservation.html', {'reserve': reserve})
    except Reserve.DoesNotExist:
        # 精确捕获预订不存在的异常,避免隐藏其他错误
        return HttpResponse('你没有预订记录!')

方法二:手动通过Session存储用户名(不推荐,仅特殊场景使用)

如果不想依赖Django认证系统,可以手动将用户名存入会话,但需自行处理安全验证:

1. 在signin中存储用户名到Session

from django.shortcuts import redirect, render
from django.http import HttpResponse
from .models import Utilisateur

def signin(request):
    if request.method == 'POST':
        uname = request.POST['username']
        pwd = request.POST['password']
        # 先验证用户是否存在(注意:此处若密码是明文存储存在安全风险,建议用哈希)
        if Utilisateur.objects.filter(username=uname, password=pwd).exists():
            # 将用户名存入session
            request.session['username'] = uname
            return redirect('reservations')
        else:
            return HttpResponse('用户名或密码错误')
    return render(request, 'signin.html')

2. 在reservations中从Session获取用户名

from django.shortcuts import redirect, render
from django.http import HttpResponse
from .models import Utilisateur, Reserve

def reservations(request):
    # 从session读取用户名,不存在则跳转至登录页
    uname = request.session.get('username')
    if not uname:
        return redirect('signin')
    try:
        c = Utilisateur.objects.get(username=uname)
        reserve = Reserve.objects.get(client=c)
        return render(request, 'reservation.html', {'reserve': reserve})
    except (Utilisateur.DoesNotExist, Reserve.DoesNotExist):
        return HttpResponse('你没有预订记录!')

注意事项

  • 避免使用裸except:,始终捕获具体异常,防止隐藏代码中的其他错误
  • 自行管理用户验证时,务必对密码进行哈希存储,禁止明文存储密码,否则会导致严重安全问题

内容的提问来源于stack exchange,提问作者user19069531

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 06:57:14