如何根据用户在 Django 中是不是为管理员来重定向登录 url?

Posted

技术标签:

【中文标题】如何根据用户在 Django 中是不是为管理员来重定向登录 url?【英文标题】:How to redirect login urls depending on if the user is admin or not in Django?如何根据用户在 Django 中是否为管理员来重定向登录 url? 【发布时间】:2020-05-02 14:44:12 【问题描述】:

我还是 Django 的新手。我有一个管理员用户和一个不是管理员的普通用户。当管理员登录时,他应该被重定向到“/admin_section”,而当普通用户登录时,他应该被重定向到“/”首页。除此之外,管理员应该可以导航到“/”首页并像普通用户一样查看该页面。

我一直在尝试寻找答案,我唯一发现的是我可以在视图中使用 request.user.is_superuser 并询问用户是否是超级用户/管理员。但是问题就变成了管理员永远无法导航到首页。我还将 login_redirect_url 设置为“LOGIN_REDIRECT_URL = '/'”,这意味着每次用户登录时,他们都会被重定向到首页 - 但它不应该是这样的。

这是我目前的代码(来自 views.py 文件):

def home(request):
   # if the user is not logged-in, show the loginpage
   if not request.user.is_authenticated:
       return HttpResponseRedirect('login')

# if the user is logged-in, show the frontpage
return render(request, 'mainapp/index.html')

# return the view for the admin section
def admin(request):

    # if the user is logged-in & is an admin - show the admin section
    if request.user.is_authenticated and request.user.is_superuser:
        return render(request, 'mainapp/admin.html')

return redirect('home') # redirects to the home view

forms.py:

from django.contrib.auth.forms import AuthenticationForm
from django import forms
from django.contrib.auth import logout
from django.contrib.auth.mixins import LoginRequiredMixin, AccessMixin

# a class which act as a view - it displays the login-form
class LoginForm(AuthenticationForm, AccessMixin):
    username=forms.CharField(widget=forms.TextInput(attrs='class':'form-control'))
    password=forms.CharField(widget=forms.PasswordInput(attrs='class':'form-control'))

urls.py:

path('login/', views_auth.LoginView.as_view(form_class=LoginForm, redirect_authenticated_user=True), name='login'), # login-page

【问题讨论】:

【参考方案1】:

    创建您自己的登录视图,继承自内置登录视图,并根据您的逻辑覆盖get_success_url 方法。

    from django.contrib.auth import views as views_auth
    
    class LoginView(views_auth.LoginView):
        form_class=LoginForm
        redirect_authenticated_user=True
    
        def get_success_url(self):
            # write your logic here
            if self.request.user.is_superuser:
                return '/admin_section'
            return '/'
    

    urls.py

    urlpatterns = [
        path('login/', LoginView.as_view(),name='login'),
    ]
    

    在设置文件中提供新创建的视图作为登录 url。

    settings.py

    LOGIN_URL = 'login'
    

【讨论】:

我已经用其他文件更新了我的问题。我已经有一个 LoginView 类 - 我应该再做一个类吗? @user3740970 您可以使用我建议的 LoginView 类提供的两个参数。请参阅更新答案中的 LoginView 类。 但是以超级用户登录时没有重定向到/admin_section? 这应该是公认的答案 - 我会添加使用超级方法是最明智的 - 查看源代码:github.com/django/django/blob/master/django/contrib/auth/… @user3740970 - 您不需要设置中的 LOGIN_URL 并验证项目 urls.py 是您放置登录视图的位置 - 它应该是列表中的第一个

以上是关于如何根据用户在 Django 中是不是为管理员来重定向登录 url?的主要内容,如果未能解决你的问题,请参考以下文章

如何根据链接到用户的模型(而不是基于用户组)设置 Django 权限?

Django:如何在管理表单中获取当前用户?

使用 Django,如何在我的 javascript 中检测到管理员?

Django 管理屏幕不按名称显示实体

Django管理界面中的只读模型?

如何通过在特定控制器和操作上使用 Ajax 调用来重定向用户 [重复]