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

Django模板JS获取用户编辑权限布尔值报错求助

问题分析与解决方案

你的核心问题有两个:一是视图中定义的editable变量未传递到模板上下文,导致JS无法读取;二是Django模板输出的布尔值格式(True/False大写开头)与JS的布尔值格式(true/false小写)不兼容,直接使用会触发语法错误。以下是具体修复步骤:


步骤1:将editable传入模板上下文

修改views.py,把editable变量添加到context字典中,同时调整赋值顺序确保值正确:

@login_required
def profile(request, username):
    user = User.objects.get(username=username)
    Profile.objects.get_or_create(user=request.user)
    
    # 先判断当前用户是否为档案所有者
    editable = request.user == user

    if request.method == "POST":
        user_form = UserUpdateForm(request.POST, instance=request.user)
        profile_form = ProfileUpdateForm(request.POST, request.FILES, instance=request.user.profile)

        if user_form.is_valid() and profile_form.is_valid():
            user_form.save()
            profile_form.save()
            messages.success(request, f"Profile successfully updated!")
            return redirect("profile", username=request.user.username)
    else:
        user_form = UserUpdateForm(instance=request.user)
        profile_form = ProfileUpdateForm(instance=request.user.profile)

    # 将editable加入上下文
    context = {
        "user_form": user_form,
        "profile_form": profile_form,
        "editable": editable
    }

    return render(request, "users/profile.html", context)

步骤2:在JS中正确读取布尔值

推荐两种安全且兼容的方式:

方法1:使用json_script标签(更安全,避免XSS风险)

在profile.html的HTML部分先添加序列化后的变量:

{{ editable|json_script:"editable-status" }}

然后在JS中解析这个值:

const button = document.getElementById("button");
// 解析序列化后的布尔值
const editable = JSON.parse(document.getElementById('editable-status').textContent);

button.addEventListener("click", () => {
    const form = document.getElementById("form");

    if(form.style.display === "none" && editable){
        form.style.display = "block";
    }else{
        form.style.display = "none";
    }
});

方法2:使用模板过滤器转换格式

直接通过lower过滤器将Django的布尔值转为JS兼容的小写格式:

const button = document.getElementById("button");
// 将True转为true,False转为false
const editable = {{ editable|lower }};

button.addEventListener("click", () => {
    const form = document.getElementById("form");

    if(form.style.display === "none" && editable){
        form.style.display = "block";
    }else{
        form.style.display = "none";
    }
});

额外优化:前端权限控制

既然仅档案所有者可编辑,可直接在模板中控制编辑元素的显示,避免无效渲染:

{% if editable %}
<button id="button">编辑档案</button>
<form id="form" style="display: none;">
    <!-- 表单内容 -->
</form>
{% endif %}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 18:24:26