如何从django.contrib.auth(Django内置登录系统)获取用户名?

时间:2017-09-22 08:05:17

标签: python django authentication

我是Python和Django的新手,我正在查看使用Django内置登录系统(django.contrib.auth.login)的代码。

用户登录后,我想根据用户权限将用户重定向到适当的URL。例如,某些用户名具有管理员权限,而有些用户名只是普通用户。但是,单击“登录”按钮后,用户始终会重定向到同一URL。

为了以不同方式重定向用户,我必须检查用户名,并检查用户拥有的权限。但是,我找不到任何方法从django.contrib.auth.login获取用户名。就好像用户名在经过身份验证后就会消失。

有谁知道如何解决这个问题?

谢谢!

5 个答案:

答案 0 :(得分:1)

可以在此处找到用户名:

request.user.username

答案 1 :(得分:0)

如果你能够记录他,你应该有类似的东西(这里是部分代码):

user = authenticate(username=username, password=password)
login(request, user)

if user.is_admin and user.is_staff:
    return HttpRedirectResponse('/some/path')
elif user.idontknow:
    return HttpRedirectResponse('/some/other/path')
...
else:
    return HttpRedirectResponse('/default/redirect/url')

答案 2 :(得分:0)

登录视图支持" next"参数。因此,在表单模板中,您可以像这样添加它:

<form method="POST">
    {% csrf_token %}
    <input type="hidden" name="next" value="/go/here/if/successful" />
    {{ form }}
</form>

要在视图中执行此操作,同时尊重下一个参数并根据用户提供不同的默认值:

from django.contrib.auth.views import LoginView

class MyLoginView(LoginView):
    def get_redirect_url(self):
        next = super(MyLoginView, self).get_redirect_url()
        if not next:
            user = self.request.user  # see form_valid and auth.login()
            if user.is_staff:
                return '/staff/goes/here'

        return next

答案 3 :(得分:0)

在登录模板中有些像:

<form action="/login/" method="post">
    <input type="text" name="username" placeholder="username"/>
    <input type="password" name="password" placeholder="password"/>
</form>

django docs之类的后端说:

from django.contrib.auth import authenticate
user = authenticate(username='john', password='secret')
if user is not None:
    # A backend authenticated the credentials
else:
    # No backend authenticated the credentials

答案 4 :(得分:0)

您可以在视图中使用以下代码并将url绑定到索引函数

from django.shortcuts import render

def index(request):
    if request.user.is_admin and request.user.is_active:
        return render(request, 'admin-page.html')
    return render(request, 'user-page.html')