Django中request.user与传入username值视觉一致却判定为不同用户的问题求助
问题根源:类型不匹配导致的比较错误
你遇到的这个问题非常典型——你在把一个Django User对象和一个字符串直接做相等比较,哪怕它们的用户名文本看起来完全一样,这种跨类型的比较永远会返回False。
让我拆解一下:
request.user(也就是你的vng_u变量)是Django内置User模型的实例对象,它包含用户ID、用户名、邮箱等所有用户属性;username(你的us变量)是从URL路径传进来的纯字符串,只是用户名的文本值。
虽然在页面上显示{{uv}}时,Django会调用User对象的__str__方法默认输出用户名文本,让你视觉上觉得和postuser的字符串一样,但本质上一个是对象,一个是字符串,二者根本不是同一类型,所以比较结果必然是不相等。
具体修复方案
1. 后端代码修复(views.py)
把对象和字符串的比较,改成对象的username属性和字符串比较,或者直接比较两个User对象(更可靠):
def upost(request, username): if request.method == 'GET': vng_u = request.user us = username vd_u = get_object_or_404(User, username=username) p_o_u = Name.objects.filter(user=vd_u).order_by('id').reverse() if request.user.is_anonymous: return redirect('login') else: # 方案一:比较用户名字符串(直接对应传入的username参数) if vng_u.username == us: s = "same" else: s = "not" # 方案二:比较User对象(更严谨,基于用户主键判断) # if vng_u == vd_u: # s = "same" # else: # s = "not" pgntr = Paginator(p_o_u,1) pn = request.GET.get('page') pgobj = pgntr.get_page(pn) return render(request, "network/users.html", { "xp": p_o_u, "pc": pgobj, "postuser": us, "uv": vng_u, "s":s })
2. 前端模板修复(HTML)
同样,模板里需要用User对象的username属性和字符串postuser比较:
{% if uv.username == postuser %} same {%else%} not the same {% endif %} {{s}} <div id="post-users"><br> Viewer: <strong id="v1">{{uv.username}}</strong><br> <!-- 这里显式输出username更清晰 --> Poster: <strong id="v2">{{postuser}}</strong> {% for x in xp %}<br><hr> Content: {{x.content}}<br> {{x.timestamp}} {% endfor %} </div>
调试小技巧
以后遇到这类视觉一致但判断不符的问题,可以用以下方法快速排查:
- 后端打印类型:
print(type(vng_u), type(us)),你会看到输出是<class 'django.contrib.auth.models.User'>和<class 'str'>; - 模板打印详细信息:用
{{ uv|pprint }}可以看到User对象的完整结构,直观区分对象和字符串。
内容的提问来源于stack exchange,提问作者john foreign PH
相关产品推荐
相关产品推荐

