Перенаправление определенного представления на основе поля 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 %}