老时小时 2025-06-23 10:23 采纳率: 80%
浏览 6
已结题

django用户问题


from django.shortcuts import render
from django.http import HttpResponse,HttpResponseRedirect
from user.models import User
from . import models
from .models import Note
from django.core.paginator import Paginator
# Create your views here.files:note/views note/views.py
def check_login(fn):
    def wrap(request,*args, **kwargs):
        if not hasattr(request, 'session'):
            return HttpResponseRedirect('/user/login')
        elif 'result' not in request.session:
            return HttpResponseRedirect('/user/login')
        return fn(request,*args,**kwargs)
    return wrap
@check_login
def list_view(request):
    #判断两种没有登陆的情况,
    # if not hasattr(request,'session'):
    #     return HttpResponseRedirect('/user/login')
    # elif 'result' not in request.session:
    #     return HttpResponseRedirect('/user/login')
    user_id=request.session['result']['id']
    auser=User.objects.get(id=user_id)
    notes=auser.note_set.all()#反向关系管理器,默认名称是 小写模型名_set(这里是 note_set) 表示:"获取这个用户所有的笔记"
    return render(request,'note/showall.html',locals())
@check_login
def list_view_page(request):
    #判断两种没有登陆的情况,
    # if not hasattr(request,'session'):
    #     return HttpResponseRedirect('/user/login')
    # elif 'result' not in request.session:
    #     return HttpResponseRedirect('/user/login')
    user_id=request.session['result']['id']
    auser=User.objects.get(id=user_id)
    notes=auser.note_set.all().order_by('-create_time')#反向关系管理器,默认名称是 小写模型名_set(这里是 note_set) 表示:"获取这个用户所有的笔记"
    #添加分页功能
    paginator=Paginator(notes,5)
    cur=request.GET.get('page',1)#得到当前的页码
    cur_page=int(cur)
    page=paginator.page(cur_page)
    return render(request,'note/showall_page.html',locals())
@check_login
def add_views(request):
    if request.method=='GET':
        return render(request,'note/addnote.html')
    elif request.method=='POST':
        title=request.POST['title']
        content=request.POST['content']
        user_id=request.session['result']['id']
        auser=User.objects.get(id=user_id)
        res=models.Note(user=auser,tilte=title,content=content)
        res.save()
        return HttpResponseRedirect('/note')
@check_login
def mod_views(request,id):
    #得到当前用户的模型对象
    user_id=request.session['result']['id']
    auser=User.objects.get(id=user_id)
    anote=Note.objects.get(user=auser,id=id)
    if request.method=='GET':
        return render(request,'note/modnote.html',locals())
    elif request.method=='POST':
        tilte=request.POST.get('title')
        content=request.POST.get('content')
        anote.tilte=tilte
        anote.content=content
        anote.save()
        return HttpResponseRedirect('/note')
@check_login
def look_views(request,id):
    #得到当前用户的模型对象
    user_id=request.session['result']['id']
    auser=User.objects.get(id=user_id)
    anote=Note.objects.get(user=auser,id=id)
    if request.method=='GET':
        return render(request,'note/looknote.html',locals())
    # elif request.method=='POST':
    #     tilte=request.POST.get('title')
    #     content=request.POST.get('content')
    #     anote.tilte=tilte
    #     anote.content=content
    #     anote.save()
    #     return HttpResponseRedirect('/note')
@check_login
def del_view(request,id):
    user_id = request.session['result']['id']
    auser = User.objects.get(id=user_id)
    anote = Note.objects.get(user=auser, id=id)
    anote.delete()
    return HttpResponseRedirect('/note')
from django.conf import settings
import os
def upload_view(request):
    if request.method=='GET':
        return render(request,'note/upload.html',locals())
    elif request.method=='POST':
        afile=request.FILES['myfile']
        print('got it ',afile.name)
        #计算保存文件的位置
        filename=os.path.join(settings.MEDIA_ROOT,afile.name)
        with open(filename,'wb') as fw:
            fw.write(afile.file.read())
            return HttpResponse('got it '+str(afile.name))
        return HttpResponse('file load failed!')

from django.shortcuts import render
from django.http import HttpResponse,HttpResponseRedirect
from . import models,form
from django.contrib.auth.models import User
# Create your views here.file:user/views.py
# def index_view(request):
#     return render(request,'user/index.html',locals())
def reg_view(request):
    if request.method=='GET':
        return render(request,'user/register.html')
    elif request.method=='POST':
        username=request.POST.get('username')
        password=request.POST.get('password')
        password1=request.POST.get('password1')
        if len(username)<4:
            username_error='要求大于4字符'
            return render(request,'user/register.html',locals())
        elif len(password)==0:
            password_error='密码不能为空'
            return render(request, 'user/register.html', locals())
        elif password!=password1:
            password1_error='两次密码不一致'
            return render(request, 'user/register.html', locals())
        try:
            User.objects.get(username=username)
            username_error='用户名存在'
            return render(request, 'user/register.html',locals())
        except:
            User.objects.create_user(username=username,password=password)
            html = "'注册成功'<a href='login'>进入登陆</a>"
            resp=HttpResponse(html)
            resp.set_cookie('username',username)
            return resp
            # User.objects.create_superuser(username=username,password=password,email='')#创建管理员账户
        #下面的代码是注册到自己写的table里面
        # try:
        #     models.User.objects.get(username=username)
        #     username_error='用户名存在'
        #     return render(request, 'user/register.html',locals())
        # except:
        #     models.User.objects.create(username=username,password=password)
        #     html="'注册成功'<a href='login'>进入登陆</a>"
        #     resp=HttpResponse(html)
        #     resp.set_cookie('username',username)
        #     return resp
def login_view(request):
    if request.method=='GET':
        username=request.COOKIES.get('username')
        return render(request,'user/login.html',locals())
    elif request.method=='POST':
        username=request.POST.get('username')
        password=request.POST.get('password')
        if username=='':
            username_error='用户名不能为空'
            return render(request,'user/login.html',locals())
        try:
            auser = User.objects.get(username=username)
            if auser.check_password(password):
                # session里记录登陆状态,记录姓名和ID
                request.session['result'] = {'username': username, 'id': auser.id}
                resp = HttpResponseRedirect('/')
                if 'remember' in request.POST:  # 选中状态
                    resp.set_cookie('username', username)
                return resp
                # return HttpResponse('sucess')
            else:
                password_error='密码不对'
                render(request,'user/login.html',locals())
        except:
            password_error = '用户名或者密码不对'
            return render(request, 'user/login.html', locals())
        #以下代码是登陆自己写的数据库
        # try:
        #     auser=models.User.objects.get(username=username,password=password)
        #     #session里记录登陆状态,记录姓名和ID
        #     request.session['result']={ 'username':username,'id':auser.id}
        #     resp=HttpResponseRedirect('/')
        #     if 'remember' in request.POST:#选中状态
        #         resp.set_cookie('username',username)
        #     return resp
        #     # return HttpResponse('sucess')
        # except:
        #     password_error='用户名或者密码不对'
        #     return render(request,'user/login.html',locals())
def log_out_view(request):
    if 'result' in request.session:
        del request.session['result']
    return HttpResponseRedirect('/')#回到主页

def reg2_view(request):
    if request.method=='GET':
        myform=form.MyregForm()
        # html=myform.as_p()
        # print(html)
        # return HttpResponse(html)
        return render(request,'user/reg2.html',locals())
    elif request.method=='POST':
        myform=form.MyregForm(request.POST)
        if myform.is_valid():
            dic=myform.cleaned_data
            username=dic['username']
            password=dic['password']
            password1=dic['password1']
            age=dic['age']
            idnum=dic['idnum']
            return HttpResponse(str(dic))
        else:
            return HttpResponse('failed!!!')



使用自己的数据库一切正常,能添加修改云笔记,使用系统给的author_user时候注册登陆正常,进入‘我的云笔记’时候浏览器出现以下错误:DoesNotExist at /note/

User matching query does not exist.

Request Method:     GET
Request URL:     http://127.0.0.1:8000/note/
Django Version:     4.2.11
Exception Type:     DoesNotExist
Exception Value:     

User matching query does not exist.

Exception Location:     /usr/lib/python3/dist-packages/django/db/models/query.py, line 637, in get
Raised during:     note.views.wrap
Python Executable:     /usr/bin/python3.12
Python Version:     3.12.3
Python Path:     

['/home/sanky/code/tenada/part444/django/code/mysite3',
 '/home/sanky/code',
 '/snap/pycharm-professional/413/plugins/python/helpers/pycharm_display',
 '/usr/lib/python312.zip',
 '/usr/lib/python3.12',
 '/usr/lib/python3.12/lib-dynload',
 '/usr/local/lib/python3.12/dist-packages',
 '/usr/lib/python3/dist-packages',
 '/snap/pycharm-professional/413/plugins/python/helpers/pycharm_matplotlib_backend']

Server time:     Mon, 23 Jun 2025 10:21:25 +0800

  • 写回答

3条回答 默认 最新

  • 一杯年华@编程空间 2025-06-23 10:28
    关注

    一杯年华@编程空间帮您解答,本答案结合 ChatGPT4.0和DeepSeek整理

    我曾经遇到过类似的问题,当切换到 Django 系统自带的 auth_user 表后,访问笔记功能时报错 “User matching query does not exist”,这本质上是用户模型关联和数据获取方式不匹配导致的。结合你的代码和报错信息,以下是具体分析和解决方案:

    问题核心原因

    1. 模型关联冲突:你的 Note 模型可能仍在使用自定义的 User 模型,而切换到 auth_user 后,外键关联未同步修改,导致查询时找不到对应用户记录。
    2. 用户数据获取方式错误:视图函数中通过 request.session['result']['id'] 获取用户 ID,但 Django 自带的认证系统会将用户信息存储在 request.user 中,自定义 session 数据与系统认证数据不一致。
    3. 数据迁移缺失:若之前使用自定义用户表并创建了笔记数据,切换到 auth_user 后,未将旧用户数据迁移至新表,导致笔记关联的用户 ID 在新表中不存在。

    解决方案

    方案一:修正模型关联与用户获取逻辑(最优方案)

    1. 确认 Note 模型的外键指向
      检查 Note 模型的 user 字段是否正确关联到 auth.User 模型。若当前关联的是自定义 User 模型,需修改为:

      from django.contrib.auth.models import User
      
      class Note(models.Model):
          user = models.ForeignKey(User, on_delete=models.CASCADE)
          # 其他字段...
      

      原因:确保 Note 表的外键指向系统认证的用户表,避免跨表查询冲突。

    2. 调整视图函数中的用户获取方式
      视图中不再通过 session['result'] 获取用户,而是直接使用 request.user

      @check_login
      def list_view(request):
          auser = request.user  # 直接获取当前登录用户
          notes = auser.note_set.all()
          return render(...)
      

      原因:Django 认证系统会自动将登录用户对象存入 request.user,无需自定义 session 存储,避免数据不一致。

    3. 优化登录逻辑
      在登录视图中,使用 django.contrib.auth.login 函数替代手动设置 session,确保 request.user 正确赋值:

      from django.contrib.auth import login, authenticate
      
      def login_view(request):
          # 认证用户
          user = authenticate(username=username, password=password)
          if user:
              login(request, user)
              return HttpResponseRedirect('/')
      

      原因:系统登录函数会自动处理 session 和 request.user,无需手动维护 session 数据。

    方案二:数据迁移与兼容性处理

    1. 迁移旧用户数据到 auth_user
      若之前使用自定义用户表并存在历史数据,需通过数据迁移将旧用户的笔记关联到新用户表:

      • 创建迁移脚本,查询旧用户表中的用户与笔记数据,在 auth_user 中创建对应的用户,并更新 Note 表的 user 外键。
      • 示例逻辑(需根据实际模型调整):
        for old_user in models.User.objects.all():
            new_user = User.objects.create_user(
                username=old_user.username,
                password=old_user.password  # 注意密码加密问题
            )
            # 更新该用户的所有笔记关联
            Note.objects.filter(user=old_user).update(user=new_user)
        

      原因:确保历史笔记数据与新用户表正确关联,避免因用户 ID 不存在导致报错。

    2. 兼容新旧用户表的查询逻辑
      若暂时无法完全迁移数据,可在视图中增加兼容逻辑,优先查询 auth_user,若不存在则查询旧用户表:

      from django.contrib.auth.models import User
      
      def get_user_by_id(user_id):
          try:
              return User.objects.get(id=user_id)
          except User.DoesNotExist:
              try:
                  return models.User.objects.get(id=user_id)  # 旧用户表
              except models.User.DoesNotExist:
                  raise Http404("用户不存在")
      

      原因:临时兼容新旧数据,为彻底迁移争取时间,但此方案仅适用于过渡期,长期使用会增加代码复杂度。

    最优方案详解(方案一)

    选择修正模型关联与用户获取逻辑,是因为它从根本上解决了以下问题:

    1. 模型设计一致性:确保 Note 表与 Django 认证系统的用户表直接关联,符合官方最佳实践,避免自定义认证系统与官方系统的冲突。
    2. 简化数据获取流程:直接使用 request.user 替代自定义 session,减少手动维护 session 数据的风险(如 session 过期、数据格式错误等)。
    3. 便于后续扩展:基于官方认证系统,可直接使用 Django 提供的权限管理、用户组等功能,无需重复开发。

    操作时需注意:

    • 执行模型变更后,需通过 python manage.py makemigrationsmigrate 同步数据库结构。
    • 若存在历史数据,需先清空或迁移 Note 表中的旧关联数据,避免残留无效外键。

    以上方案可逐步排查问题根源,建议先尝试最优方案。若操作中有任何疑问或报错,请继续留言,我会帮你进一步分析!如果问题解决了,还请楼主采纳哦~

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 7月1日
  • 已采纳回答 6月23日
  • 创建了问题 6月23日