如何根据用户在 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 权限?