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

Django点击登录用户头像出现MultiValueDictKeyError,需显示编辑当前用户详情

解决Django中点击用户头像的MultiValueDictKeyError并显示当前用户详情

问题根源

  1. MultiValueDictKeyError原因:视图中直接使用request.GET['profileid'],但点击头像进入页面时URL未携带profileid参数,GET字典中找不到该键就会抛出错误。
  2. 逻辑冗余:已通过session保存登录用户的id,完全无需从URL传递用户ID来获取当前用户。
  3. 模板错误:视图传递的是单个用户对象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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 21:34:51