Django点击登录用户头像出现MultiValueDictKeyError,需显示编辑当前用户详情
解决Django中点击用户头像的MultiValueDictKeyError并显示当前用户详情
问题根源
- MultiValueDictKeyError原因:视图中直接使用
request.GET['profileid'],但点击头像进入页面时URL未携带profileid参数,GET字典中找不到该键就会抛出错误。 - 逻辑冗余:已通过session保存登录用户的
id,完全无需从URL传递用户ID来获取当前用户。 - 模板错误:视图传递的是单个用户对象
profile,但模板中用{% for profile in profile %}循环遍历单个对象,会导致渲染异常。
修复方案
1. 修改视图文件views.py
更新视图逻辑,直接从session获取当前用户ID,同时支持POST请求更新用户信息:
from django.shortcuts import render, get_object_or_404 from .models import registertb def profile(request): # 检查用户是否登录 if not request.session.has_key('id'): # 可根据需求跳转到登录页,此处示例返回提示 return render(request, 'login.html') # 从session获取当前登录用户ID uid = request.session['id'] # 获取当前用户对象,不存在则返回404 profile = get_object_or_404(registertb, id=uid) # 处理表单提交(更新用户信息) if request.method == 'POST': profile.User_name = request.POST.get('name') profile.email = request.POST.get('email') # 处理头像上传 if 'user_image' in request.FILES: profile.user_image = request.FILES['user_image'] profile.save() # 保存后刷新页面或跳转到指定页面 return render(request, 'profiles.html', {'profile': profile}) # GET请求时渲染用户信息 return render(request, 'profiles.html', {'profile': profile})
2. 修改HTML模板
移除不必要的循环,简化表单action,优化图片显示逻辑:
<body> {% if request.session.id %} <form action="/myprofile/" method="post" enctype="multipart/form-data"> {% csrf_token %} <div id="profile-container"> <input type="file" id="image-input" name="user_image" accept="image/*" onchange="displayUserProfile()"> <!-- 处理用户未上传头像的情况,避免url报错 --> <img id="profile-image" src="{% if profile.user_image %}{{ profile.user_image.url }}{% else %}/path/to/default-avatar.png{% endif %}" alt="Profile Picture"> <label for="name">Name:</label> <input type="text" id="name" name="name" value="{{ profile.User_name }}" placeholder="Your Name" required> <label for="email">Email:</label> <input type="email" id="email" name="email" value="{{ profile.email }}" placeholder="Your Email" required> <!-- 其他用户信息字段 --> <button type="submit">Update Profile</button> </div> </form> <script> function displayUserProfile() { var input = document.getElementById('image-input'); var image = document.getElementById('profile-image'); // 检查是否选择了文件 if (input.files && input.files[0]) { var reader = new FileReader(); reader.onload = function (e) { image.src = e.target.result; }; reader.readAsDataURL(input.files[0]); } } </script> {% else %} <!-- 用户未登录时的提示或跳转 --> <p>请先登录</p> {% endif %} </body> </html>
关键优化点
- 直接从session获取用户ID,避免依赖URL参数,彻底解决MultiValueDictKeyError。
- 确保只加载当前登录用户的信息,无需传递额外参数。
- 支持表单POST提交更新用户信息,包含头像上传处理。
- 模板中移除不必要的循环,修复单个对象遍历的错误。
- 添加用户未上传头像时的默认图片,避免页面报错。
内容的提问来源于stack exchange,提问作者knowledge
相关产品推荐
相关产品推荐

