Как перенаправить URL входа в зависимости от того, является ли пользователь администратором или нет в Django? - PullRequest
0 голосов
/ 15 января 2020

Я все еще новичок в 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 Ответ

0 голосов
/ 15 января 2020
  1. Создайте свой собственный вид входа в систему, унаследованный от встроенного вида входа в систему, и переопределите метод get_success_url в соответствии с вашей логикой c.

    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'),
    ]
    
  2. Предоставить вновь созданное представление в качестве URL для входа в файл настроек.

    settings.py

    LOGIN_URL = 'login'
    
...