我正在尝试为用户可以访问的仪表板创建登录页面,但他们无法访问主管理页面。我设置了我需要的权限和组。我想使用内置的登录视图,但我无法弄清楚如何更改模板位置,因此我将视图从django / contrib / auth / views复制到我自己项目中的auth_views。然后我将模板覆盖到正确的位置。此时一切正常,我进入登录页面并输入我的凭据。但是,我没有重定向到仪表板,而是重定向回登录页面,form.is_valid()
由于某种原因返回false。
我还尝试将django.contrib.auth.views作为auth_views导入并将模板移动到他们想要的位置,但我遇到了同样的问题。
这是我的代码:
urls.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 %}
我无法弄清楚为什么表单不能通过验证,它应该是一个登录表单。用户不是员工,也不是超级用户,但是处于活动状态。有什么可能是我不断被重定向回登录页面的原因?我知道接下来设置正确,因为我检查了它,用户似乎是在登录时使用AnonymousUser登录并在登录后重定向回登录页面它会显示用户的用户名,但仍然说form.is_valid ()是假的。如果它正在记录用户,为什么它不允许我重定向到仪表板,即使我尝试手动输入URL我带回登录页面,就像装饰者不通过时一样。但是用户位于“客户端”组中,并且具有clients.is_client权限。我已经尝试了两种方法,无法让它发挥作用。
有什么想法吗?
另外,如何更改内置登录视图的模板位置,而无需复制整个视图文件并以此方式更改?当我删除装饰器时它确实有效,但是这一切都失败了。
感谢您的帮助
答案 0 :(得分:1)
登录用户
登录表单:
class AuthenticationForm(forms.Form):
"""
Login form
"""
email = forms.EmailField(label="Email")
password = forms.CharField(widget=forms.PasswordInput())
class Meta:
fields = ['email', 'password']
登录视图
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)
...
用户登录后,用户将能够提交表单。
如果您使用的是用户名而不是电子邮件登录,只需使用这些值。
显然上面是一种肮脏的方式,你应该验证所有登录等标准的Django方式。在表单中验证用户,使用clean_data
等。
我试图说的是,在你让他们做任何其他事情之前先登录用户。
修改强>
尝试使用以下内容检查权限:
权限可能是错误的用户组等。测试它是这样的:
`Permission.objects.filter(
user=request.user, codename='perm_name' ).exists()`
还要确保导入:
from django.contrib.auth.decorators import login_required, user_passes_test, permission_required