Перенаправление определенного представления на основе поля django

Мне нужно перенаправить после входа в систему на определенный вид в соответствии с полем "Profesor", если это False, перенаправить на "vistaAlumno", если True, перенаправить на "vistaProfesor".

views.py

    def profesor(user):
    return (user.profesor)
@login_required
@user_passes_test(profesor)
def vistaProfesor(request):
    rut= request.user.rut_user
    notas = Nota.objects.select_related('id_asignatura','rut_alumno').filter(rut_profesor=rut)
    observaciones = Observacion.objects.filter(rut_profesor=rut)    
    return render(request, 'core/vistaProfesor.html', {'notas': notas,  'observaciones': observaciones})
        


@login_required
def vistaAlumno(request):
    if request.user.profesor == False:
        rut= request.user.rut_user         
        notas = Nota.objects.select_related('id_asignatura').select_related('rut_profesor').filter(rut_alumno=rut)
        asistencias = Asistencia.objects.filter(rut_alumno=rut)
        #Necesito unir la tabla observacion con profesor, lo cual ya hace, pero luego quiero unir la tabla profesor con asignatura y mostrar el nombre en el vistaAlumno.html
        observaciones = Observacion.objects.select_related('rut_profesor').filter(rut_alumno=rut)          
        curso = Alumno.objects.filter(rut_alumno=rut).values_list('id_curso')
        horarios = Horario.objects.select_related('rut_profesor','id_asignatura','id_sala').filter(id_curso__in=curso)   
        return render(request, 'core/vistaAlumno.html', {'notas': notas, 'asistencias': asistencias, 'observaciones': observaciones, 'horarios': horarios})
    else:
        vistaProfesor(request)

models.py

class User(AbstractUser):  
profesor = models.BooleanField(default=False)
rut_user = models.IntegerField(null=True) 

settings.py

LOGIN_REDIRECT_URL = '/vistaAlumno'

Я собираюсь проиллюстрировать фреймворк аутентификации Django, используемый для входа на сайт. Надеюсь, вы сможете использовать это для решения своей проблемы.

Предположим, что мы уже собрали имена и пароли пользователей из нашего forms.py файла в каталоге приложения app:

from django import forms

class LoginForm(forms.form):
    username = forms.CharField()
    password = forms.CharField(widget=forms.PasswordInput)

N.B: Эта форма аутентифицирует пользователей по базе данных. Элемент PasswordInput отображает элемент password HTML.

Редактирование views.py:

from django.http import HttpResponse
from django.shortcuts import render
from django.contrib.auth import authenticate, login
from .forms import LoginForm

def user_login(request):
    if request.method == 'POST':
        if form.is_valid():
            cd = form.cleaned_data
            user = authenticate(request, username=cd['username'], password=cd['password'])
        
            if user is not None:
                if user.is_active:
                    login(request, user)    
                    return HttpResponse('Authenticated') 
                    #or
                    # return render(request, 'some_other_page.html', {'form': form})
                else:
                    return HtppResponse('Disabled account')
            else:
                return HttpResponse('Invalid login')
        else:
            form = LoginForm()
            return render(request, 'account/login.html', {'form': form})

В приложениях urls.py

from django.urls import path
from . import views

urlpatterns = [
    #post views
    path('login/', views.user_login, 'login'),
]

Мы должны обновить файл urls.py в основном каталоге проекта, предполагая, что наш проект называется testproject.

from django.urls import path, include
from django.contrib import admin

urlpatterns = [
    path('admin/', admin.site.urls),
    path('account/', include('account.urls')),
]

Каталог приложений app:

templates/
    account/
        login.html
    base.html

Отредактируйте шаблон base.html:

{% load static %}
<!DOCTYPE html>
<html>
<head>
    <title>{% block title %}Put title here{% endblock %}</title>
    <link href="{% static "css/base.css" %}" rel="stylesheet">
</head>
<body>
    <div id="header">
        <span class="logo">Test Project</span>
    </div>
    <div id="content">
        {% block content %}{% endblock %}
    </div>
</body>
</html>

В account/login.html:

{% extends "base.html" %}
{% block title %}Log-in{% endblock %}
{% block content %}
    <h1>Log-in</h1>
    <p>Please, use the following form to log-in:</p>
    <form method="post">
        {{ form.as_p }}
        {% csrf_token %}
        <p><input type="submit" value="Log in"></p>
    </form>
{% endblock %}
Вернуться на верх