Python 非管理员仪表板的Django登录页面
我正在尝试为用户可以访问但无法访问主管理页的仪表板创建登录页。我设置了所需的权限和组。我想使用内置的登录视图,但我不知道如何更改模板位置,所以我在自己的项目中将视图从django/contrib/auth/views复制到auth_视图。然后我将模板重写到正确的位置。现在一切正常,我进入登录页面,输入我的凭证。但是没有重定向到仪表板,我被重定向回登录页面,Python 非管理员仪表板的Django登录页面,python,django,login,Python,Django,Login,我正在尝试为用户可以访问但无法访问主管理页的仪表板创建登录页。我设置了所需的权限和组。我想使用内置的登录视图,但我不知道如何更改模板位置,所以我在自己的项目中将视图从django/contrib/auth/views复制到auth_视图。然后我将模板重写到正确的位置。现在一切正常,我进入登录页面,输入我的凭证。但是没有重定向到仪表板,我被重定向回登录页面,form.is\u valid()出于某种原因返回false 我还尝试了将django.contrib.auth.views作为auth_视图
form.is\u valid()
出于某种原因返回false
我还尝试了将django.contrib.auth.views作为auth_视图导入,并将模板移动到他们想要的位置,但我遇到了同样的问题
这是我的密码:
URL.py:
urlpatterns = [
url(_(r'^dashboard/'), views.dashboard, name="dashboard"),
url(_(r'^dashboard-login/'), auth_views.login, name="dashboard-login"),
]
views.py:
def in_client_group(user):
if user:
return user.groups.filter(name='Clients').count() == 0
return False
@user_passes_test(in_client_group, login_url='/dashboard-login/')
#@permission_required('client.is_client', login_url='/dashboard-login/')
def dashboard(request):
current_client = request.client
files = ClientUpload.objects.filter(client__icontains=current_client)
if request.method == 'POST':
form = UploadFileForm(request.POST, request.FILES)
if form.is_valid():
new_file = UploadFile(file = request.FILES['file'])
new_file.save()
return HttpResponsePermanentRedirect('/dashboard/')
else:
form = UploadFileForm()
data = {'form': form, 'client': current_client, 'files': files}
return render_to_response('dashboard.html', data, context_instance=RequestContext(request))
dashboard_login.html:
{% extends "base.html" %}
{% load i18n %}
{% block title %}XXXX - {% trans 'Login to Dashboard' %}{% endblock title %}
{% block extra_css %}
{% endblock extra_css %}
{% block content %}
{% block page_header %}{% endblock page_header %}
{% if form.errors %}
<p>{% blocktrans %}Your username and password didn't match. Please try again.{% endblocktrans %}</p>
{% endif %}
<form method="post" action="{% url 'dashboard-login' %}">
{% csrf_token %}
<table>
<tr>
<td>{{ form.username.label_tag }}</td>
<td>{{ form.username }}</td>
</tr>
<tr>
<td>{{ form.password.label_tag }}</td>
<td>{{ form.password }}</td>
</tr>
</table>
<input type="submit" value="{% trans 'Login' %}" style="margin-top: 10px; margin-right: 5px;" />
<input type="hidden" name="next" value="{{ next }}" />
</form>
<p>isvalid={{ valid }} user={{ user }}</p>
{% endblock %}
{% block extra_js %}
{% endblock extra_js %}
{%extends“base.html”%}
{%load i18n%}
{%block title%}XXXX-{%trans'登录到仪表板“%}{%endblock title%}
{%block-extra_-css%}
{%endblock额外_css%}
{%block content%}
{%block page_header%}{%endblock page_header%}
{%if form.errors%}
{%blocktrans%}您的用户名和密码不匹配。请重试。{%endblocktrans%}
{%endif%}
{%csrf_令牌%}
{{form.username.label_tag}
{{form.username}
{{form.password.label_tag}}
{{form.password}}
isvalid={{valid}}用户={{user}
{%endblock%}
{%block extra_js%}
{%endblock额外_js%}
我不明白为什么表单一直没有通过验证,它应该是一个登录表单。用户既不是职员也不是超级用户,而是活动用户。可能是什么原因导致我一直被重定向回登录页面?我知道下一步设置正确,因为我检查了它,用户名似乎是登录的,因为它从AnonymousUser开始,登录并重定向回登录页面后,它显示用户的用户名,但仍然显示form.is_valid()为false。如果它正在登录用户,为什么不让我重定向到仪表板,即使我尝试手动输入URL,我也会被带回登录页面,就像装饰程序没有通过时应该发生的那样。但该用户位于“客户端”组中,并且具有“Clients.is_client”权限。我两个都试过了,但都没用
有什么想法吗
另外,如何更改内置登录视图的模板位置,而不必复制整个视图文件并进行更改?当我移除装饰器时,它确实起作用,但这违背了它的要点
谢谢你的帮助
from django.contrib.auth.decorators import login_required, user_passes_test, permission_required
那么,您的实际用户登录视图在哪里?在验证仪表板视图之前,用户是否已登录?只是询问,因为如果用户尚未登录,您的仪表板视图正在验证
@user\u passes\u test
中的组权限,如果用户未登录,它将始终返回false。所以。第一步。登录用户步骤2。验证组权限。很明显,步骤1+2可以组合在一起,应该是内置的。有一个使用内置登录名的仪表板登录名,模板有一个表单。它应该重定向到仪表板,但没有。当我删除decorators时,它会删除。您可能需要一个自定义登录视图,因为默认登录不知道您正在尝试验证其他位置的另一个视图,因此您将被发送回。我知道了。你能用一个小例子来给出答案吗。我想到的只是用模板返回render。不知道如何实际进行身份验证。如果你能提供一个例子,或者给我指出正确的方向,那将是一个巨大的帮助。将其标记为已接受。正如你所说的完全有道理。也许你正确登录了,但是你的登录没有在你的UploadFileForm
表单上发布任何内容,因此你的表单是否有效将始终无效。您得到的唯一验证是用户登录,而不是UploadFileForm
表单。登录后,您必须重新提交。我让它工作了,但由于某些原因,装饰程序仍然阻止用户重定向。当我移除它们时,它就起作用了。我知道该用户拥有这些权限,并且在该组中。为什么它们会失败?它与登录所需的装饰器一起工作,但我不明白为什么其他装饰器不工作。谢谢,我会试试。我举了一个例子:我试过了,它说它不存在。它是名为is_client的客户端模型上的权限。我试过codename='is\u client'
和codename='client.'
两种方法都不管用,为什么你认为会这样?我通常如何定义代码名?我检查了组并且组存在。运行一个查询以从权限模型中获取所有的代码名,您还可以查询组和用户权限,如果您有权访问数据库,只需使用MySQL workbench等直接查看其中的内容
redirect_to = 'your url'
if request.method == 'POST':
form = AuthenticationForm(data=request.POST)
if form.is_valid():
user = authenticate(email=request.POST['email'], password=request.POST['password'])
if user is not None:
if user.is_active:
django_login(request, user)
messages.add_message(request, messages.SUCCESS, "You are now logged in!")
return HttpResponseRedirect(redirect_to)
...
`Permission.objects.filter(
user=request.user, codename='perm_name' ).exists()`
from django.contrib.auth.decorators import login_required, user_passes_test, permission_required