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

Django中函数间无法传递name变量的问题求助

问题分析与解决方案

你用global变量传递用户名的方法在Django里完全不可行——Django视图是无状态的,每个请求由独立线程/进程处理,global是进程共享变量,不仅会导致当前取不到值的问题,还会引发多用户数据混乱的严重bug。下面是正确的解决思路和代码修改:

推荐方案:用Django Session存储用户名

Session是Django内置的用户会话管理机制,和当前用户绑定,安全且符合框架设计逻辑。

修改loger视图

from django.shortcuts import render,redirect
from django.contrib.auth.forms import AuthenticationForm
from .models import Logs,Plane
import json
from django.contrib import messages

def loger(request):
    formy = AuthenticationForm()
    if request.method == 'POST':
        formy = AuthenticationForm(data=request.POST)
        name = request.POST.get('username')
        password = request.POST.get('password')
        # 直接用ORM查询替代循环,效率更高
        log_obj = Logs.objects.filter(name=name, password=password).first()
        if log_obj:
            # 将用户名存入session
            request.session['username'] = name
            return redirect('ticket', pk=log_obj.id)
    return render(request,'project/loger.html',{'formy':formy})

修改plane视图

def plane(request):
    # 从session获取用户名,无则跳回登录页
    name = request.session.get('username')
    if not name:
        messages.error(request, '请先登录')
        return redirect('loger')

    # 直接通过name查询对应实例,避免循环全表
    try:
        plane_instance = Plane.objects.get(name=name)
        log_instance = Logs.objects.get(name=name)
    except (Plane.DoesNotExist, Logs.DoesNotExist):
        messages.error(request, '未找到匹配的用户信息')
        return redirect('loger')

    if request.method == 'POST':
        checkbox_dict_json = request.POST.get('checkboxDict')
        if checkbox_dict_json:
            checkbox_dict = json.loads(checkbox_dict_json)
            # 更新单个实例而非全表,记得调用save()
            log_instance.json_data = checkbox_dict
            log_instance.save()
            plane_instance.checkbox_dict = checkbox_dict
            plane_instance.save()

    # 直接传递Python对象给模板,无需json.dumps
    return render(request, 'project/plane.html', {
        'checkbox': plane_instance.checkbox_dict,
        'checker': plane_instance.name,
        'checker2': log_instance.name
    })

额外修正你代码中的其他问题

  • 移除了无意义的循环全表逻辑,改用ORM直接查询,大幅提升性能
  • 修复了Plane.objects.update()会修改所有表数据的致命错误
  • 增加了实例不存在的异常处理,避免触发NameError
  • 去掉了冗余的json.dumps,模板可直接处理Python对象

备选方案:URL参数传递(仅临时场景)

如果不需要持久化用户状态,可通过URL参数传递用户名:

  1. 在urls.py中配置plane的URL:
path('plane/<str:username>/', views.plane, name='plane'),
  1. 修改loger中的跳转逻辑:
return redirect('plane', username=name)
  1. 修改plane视图接收参数:
def plane(request, username):
    name = username
    # 后续逻辑同上述方案

⚠️ 此方法会将用户名暴露在URL中,不适合敏感场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 16:35:25