我一直在研究Django身份验证,但我偶然发现了一个问题:登录工作在一个页面上("发布详细信息"博客页面),但不在主页上。
这是处理此标题的base.html
的一部分
{% if user.is_authenticated %}
<a href="{% url 'blog.views.post_new' %}" class="top-menu header-icon"><span class="glyphicon glyphicon-plus"></span></a>
<a href="{% url 'blog.views.post_draft_list' %}" class="top-menu header-icon"><span class="glyphicon glyphicon-edit"></span></a>
<p class="top-menu">Hello, <a href="/edit/">{{ user.first_name }}</a>!<small> (<a href="{% url 'django.contrib.auth.views.logout' %}">Log out</a>)</small></p>
{% else %}
<form>
{% csrf_token %}
{% if next %}
<input type="hidden" name="next" value="{{ next }}" />
{% endif %}
{{ login_form.as_p }}
</form>
{% endif %}
视图对我来说似乎很好,无论如何它是
def login(request):
if request.method == 'POST':
login_form = CustomLoginForm(request.POST)
email = request.POST.get('email')
password = request.POST.get('password1')
user = authenticate(email=email, password=password)
if user is not None:
if user.is_active:
auth_login(request, user)
return HttpResponseRedirect('/')
else:
return HttpResponse("Your Blog account is disabled.")
else:
print "Invalid login details: {0}, {1}".format(email, password)
return HttpResponse("Invalid login details supplied. Get back to the <a href=\"/\">homepage</a>.")
else:
login_form = CustomLoginForm()
return render(request, 'blog/post_list.html', {})
def post_list(request):
posts = Post.objects.filter(published_date__lte=timezone.now()).order_by('-published_date')
user = CustomUser.objects.all()
user_form = CustomUserCreationForm()
login_form = CustomLoginForm()
return render(request, 'blog/post_list.html', {'posts': posts, 'user_form': user_form, 'login_form': login_form, 'user': user})
我认为问题的核心可能在base.html文件的标题上或视图上。
这是我在主页上看到的内容(即使我已登录)
这是我在详细信息页面上看到的内容(以及我在主页上应该看到的内容)
有什么想法吗?
答案 0 :(得分:2)
你的问题在这里:
user = CustomUser.objects.all()
然后
return render(request, 'blog/post_list.html',
{'posts': posts, 'user_form': user_form,
'login_form': login_form, 'user': user})
您在请求上下文中将CustomUser
个user
个对象的查询集结果传递给user
。它会覆盖django.contrib.auth.context_processors.auth
上下文处理器分配的return render(...
'users': user})
变量。
要解决此问题,只需将模板变量的名称更改为其他名称,例如:
{} + []