非管理员仪表板的Django登录页面

时间:2015-07-17 18:13:52

标签: python django login

我正在尝试为用户可以访问的仪表板创建登录页面,但他们无法访问主管理页面。我设置了我需要的权限和组。我想使用内置的登录视图,但我无法弄清楚如何更改模板位置,因此我将视图从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权限。我已经尝试了两种方法,无法让它发挥作用。

有什么想法吗?

另外,如何更改内置登录视图的模板位置,而无需复制整个视图文件并以此方式更改?当我删除装饰器时它确实有效,但是这一切都失败了。

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

  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)
     ...

  2. 用户登录后,用户将能够提交表单。

    如果您使用的是用户名而不是电子邮件登录,只需使用这些值。

    显然上面是一种肮脏的方式,你应该验证所有登录等标准的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