Release - Upload

This commit is contained in:
Js_Sman_Omen
2025-03-24 14:34:56 +01:00
commit 89f35ca466
370 changed files with 32904 additions and 0 deletions
+137
View File
@@ -0,0 +1,137 @@
<!DOCTYPE html>
<html lang="de">
{% load static %}
{% load auth_tags %}
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<title> {% block title %}Seitenname{% endblock %}</title>
<link rel="shortcut icon" href="{% static 'favicon.ico' %}" />
<link href="{% static 'css/medinf.css' %}" rel="stylesheet">
<link href="{% static 'bootstrap/css/bootstrap.css' %}" rel="stylesheet">
<link href="{% static 'css/pruefplan.css' %}" rel="stylesheet">
<link rel="stylesheet" href="https://cdn.datatables.net/1.10.22/css/jquery.dataTables.min.css">
<script src="{% static 'js/jquery-3.5.1.min.js'%}"></script>
<script src="{% static 'js/dropzone.min.js'%}"></script>
<link href="{% static 'css/dropzone.min.css' %}" rel="stylesheet">
</head>
<body>
<!-- Navigation -->
<nav id="navbar-efi" class="navbar navbar-expand-lg navbar-light">
<a class="navbar-brand" href="#">
<img src="{% static 'images/efi.jpg' %}" width="35" height="35" alt="efi">
</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent"
aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<!-- Menüteil der Navigationsliste -->
<ul class="navbar-nav mr-auto">
<!-- Studierendensuche -->
{% if user|has_group:"STUD_VIEW" or user|has_group:"STUD_VIEW_EXTENDED" %}
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
Studierende
</a>
<div class="dropdown-menu" aria-labelledby="navbarDropdown">
<a class="dropdown-item" href="{% url 'studis:index' %}">Suche</a>
{% if user|has_group:"STUD_ADMIN" %}
<div class="dropdown-divider"></div>
<a class="dropdown-item" href="{% url 'studis:reload' %}">Dateien einlesen</a>
{% endif %}
</div>
</li>
{% endif %}
<!-- Prüfungsplan -->
{% if user.is_authenticated %}
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
Prüfungsplan
</a>
<div class="dropdown-menu" aria-labelledby="navbarDropdown">
<a class="dropdown-item" href="{% url 'pp_viewer:lecturer' %}">Ansicht Lehrkräfte</a>
<a class="dropdown-item" href="{% url 'pp_viewer:student' %}">Ansicht Studierende</a>
<a class="dropdown-item" href="{% url 'pp_viewer:exam' %}">Ansicht Prüfungen</a>
<a class="dropdown-item" href="{% url 'pp_viewer:subject' %}">Ansicht Fächer</a>
{% if user|has_group:"PP_ADMIN" %}
<div class="dropdown-divider"></div>
<a class="dropdown-item" href="{% url 'pp_parser:upload_file' %}">Daten hochladen</a>
<a class="dropdown-item" href="{% url 'pp_parser:clearTable' %}">Datenbank löschen</a>
{% endif %}
</div>
</li>
{% endif %}
<!-- Django Administration -->
{% if user.is_superuser %}
<li class="nav-item">
<a class="nav-link" href="{% url 'admin:index' %}">Administration</a>
</li>
{% endif %}
</ul>
<!-- Rechtsbündiger Teil der Navigationsleiste -->
<ul class="nav navbar-nav navbar-right">
{% if user.is_authenticated %}
<li class="nav-item">
<a class="nav-link disabled" href="#">{{ user.first_name }} {{ user.last_name }}</a>
</li>
<li class="nav-item">
<a class="nav-link" href="{% url 'logout' %}?next={{ LOGOUT_REDIRECT_URL }}">Abmelden</a>
</li>
{% else %}
<li class="dropdown">
<a id="login-button" href="#" class="dropdown-toggle nav-link" data-toggle="dropdown">
Anmelden<span class="caret"></span>
</a>
<ul id="login-dp" class="dropdown-menu">
<li>
<form class="form" role="form" method="post" action="{% url 'navlogin' %}" accept-charset="UTF-8" id="login-nav">
{% csrf_token %}
{% if next %}
<input type="hidden" name="next" value="{{ next }}" />
{% endif %}
<div class="form-group">
<label class="sr-only" for="username">Benutzername</label>
<input type="text" class="form-control" id="username" name="username" placeholder="Benutzername" required>
</div>
<div class="form-group">
<label class="sr-only" for="password">Kennwort</label>
<input type="password" class="form-control" id="password" name="password" placeholder="Kennwort" required>
</div>
<div class="form-group">
<button type="submit" class="btn btn-primary btn-block">Anmelden</button>
</div>
</form>
</li>
</ul>
</li>
{% endif %}
</ul>
</div>
</nav>
<div class="container">
{% block content %} {% endblock %}
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script src="{% static 'bootstrap/js/bootstrap.bundle.js' %}"></script>
{% block javascript %} {% endblock %}
<div class="svg-hidden">
{% block svg-footer %} {% endblock %}
</div>
</body>
</html>
+25
View File
@@ -0,0 +1,25 @@
{% extends "base.html" %}
{% block title %}efi - Informationssystem{% endblock %}
{% block content %}
<div class="container">
<div class="jumbotron">
<h1>efi Informationssystem</h1>
{% if user.is_authenticated %}
<p>Herzlich Willkommen!</p>
{% else %}
<p>Bitte melden Sie sich mit Ihrer Domänenkennung an.</p>
{% endif %}
</div>
{% if error %}
<div class="alert alert-danger">
{{ error }}
</div>
{% endif %}
</div>
{% endblock %}
@@ -0,0 +1,9 @@
{% extends 'base.html' %}
{% block title %}Prüfungsplan - Datenbank gelöscht{% endblock %}
{% block content %}
<h1>Hinweis</h1>
Datenbank gelöscht!
{% endblock %}
+80
View File
@@ -0,0 +1,80 @@
{% extends 'pruefplan/tableBase.html' %}
{% block title %}Prüfungsplan - Ansicht Prüfungen{% endblock %}
{% block additionalScript %}
<script>
$.fn.dataTable.moment( 'DD.MM.YYYY HH:mm' );
</script>
{% endblock %}
{% block table %}
<h3>Prüfungsplan - Ansicht Prüfungen</h3>
<div class="container mb-3 mt-3" >
<table id="examTable" class="display" style="width: 100%">
<thead>
<tr>
<th>Datum</th>
<th>Wochentag</th>
<th>Fachkennung</th>
<th>Fächer</th>
<th>Fächerbezeichnung</th>
<th>Teilprüfung</th>
<th>Aufsichtsperson</th>
</tr>
</thead>
<tbody>
{% for ex in exams %}
<tr>
<td>{{ ex.date|date:"d.m.Y" }} {{ ex.time|date:"H:i" }}</td>
<td>{{ ex.weekday }}</td>
<td>
{% for partialExam in ex.partialexam_set.all %}
{% for subject in partialExam.subjectIds.all %}
{{ subject.initials }}<br/>
{% endfor %}
{% endfor %}
</td>
<td>
{% for partialExam in ex.partialexam_set.all %}
{{ partialExam.identification }} <br/>
{% endfor %}
</td>
<td>
{% for partialExam in ex.partialexam_set.all %}
{% for subject in partialExam.subjectIds.all %}
{{ subject.name }}<br/>
{% endfor %}
{% endfor %}
</td>
<td>
{% for partialExam in ex.partialexam_set.all %}
{% for subject in partialExam.subjectIds.all %}
{{ subject.identification }}<br/>
{% endfor %}
{% endfor %}
</td>
<td>
{% for supervisor in supervisorSetDict|get_item:ex.identification %}
{{ supervisor }}<br/>
{% endfor %}
</td>
</tr>
{% endfor %}
</tbody>
<tfoot>
</tfoot>
</table>
</div>
<script>
$('#examTable').DataTable({
"lengthMenu": [[10, 25, 50, -1], [10, 25, 50, "All"]],
"language": { url: '//cdn.datatables.net/plug-ins/1.10.24/i18n/German.json'}
});
</script>
{% endblock %}
@@ -0,0 +1,30 @@
{% extends 'base.html' %}
{% block content %}
<div style="padding:20px;">
<h3>Fehlermeldungen</h3>
<div style="margin-top:40px;">
<h4>Beim Upload und Einlesen der Rohdateien sind folgende Fehler aufgetreten: </h4>
<ul>
{% for exception in exceptions %}
<p>{{ exception }}</p>
{% endfor %}
</ul>
</div>
</div>
<div style="padding:20px;">
<h3>Warnmeldungen</h3>
<div style="margin-top:40px;">
<h4>Beim Upload und Einlesen der Rohdateien sind folgende Warnmeldungen aufgetreten: </h4>
<ul>
{% for warning in warnings %}
<p>{{ warning }}</p>
{% endfor %}
</ul>
</div>
</div>
{% endblock %}
+50
View File
@@ -0,0 +1,50 @@
{% extends 'pruefplan/tableBase.html' %}
{% load static %}
{% block title%}Prüfungsplan - Ansicht Lehrkräfte{% endblock %}
{% block table %}
<h3>Prüfungsplan - Ansicht Lehrkräfte</h3>
<div class="container mb-3 mt-3">
<table id="lecturerTable" class="display" style="width: 100%">
<thead>
<tr>
<th>ID</th>
<th>Vorname</th>
<th>Nachname</th>
<th>Titel</th>
<th>Prüfungen</th>
</tr>
</thead>
<tbody>
{% for lec in lecturers %}
<tr>
<td>{{ lec.identification }}</td>
<td>{{ lec.firstName }}</td>
<td>{{ lec.lastName }}</td>
<td>{{ lec.title }}</td>
<td>
<a href="{% url 'pp_viewer:examForLecturer' lecturer_id=lec.identification %}" role="button" class="btn btn-outline-warning">
<img src="{% static 'open-iconic/svg/list.svg' %}" alt="Prüfungen" width="20" height="20" >
</a>
</td>
</tr>
{% endfor %}
</tbody>
<tfoot></tfoot>
</table>
</div>
<script>
var lecturerTable = $("#lecturerTable").DataTable({
lengthMenu: [
[10, 25, 50, -1],
[10, 25, 50, "All"]
],
language: { url: "//cdn.datatables.net/plug-ins/1.10.24/i18n/German.json" }
});
</script>
{% endblock %}
@@ -0,0 +1,230 @@
<!DOCTYPE html!>
{% extends "pruefplan/tableBase.html" %}
{% load static %}
{% block additionalScript %}
<script>
$.fn.dataTable.moment("DD.MM.YYYY HH:mm");
</script>
{% endblock %}
{% block table %}
<div class="container mb-3 mt-3">
<h3>Prüfungsplan - {{ lecturer.firstName }} {{ lecturer.lastName }}</h3>
<table id="lecturerExamTable"
class="display table-striped"
style="width: 100%">
<thead>
<tr>
<th>Datum</th>
<th>Wochentag</th>
<th>Raum</th>
<th>Fachkennung</th>
<th>Fächer</th>
<th>Fächerbezeichnung</th>
<th>Teilprüfung</th>
<th>Anzahl Anmeldungen</th>
<th>Aufsichtsart</th>
</tr>
</thead>
<tbody>
{% for examExeLine in lecExamLines %}
<tr data-toggle="collapse" data-target="#{{ forloop.counter }}" class="accordion-toggle">
<td>{{ examExeLine.date|date:"d.m.Y" }} {{ examExeLine.time|date:"H:i" }}</td>
<td>{{ examExeLine.weekday }}</td>
<td>{{ examExeLine.location|default_if_none:'' }}</td>
<td>{{ examExeLine.examIdent|default_if_none:'' }}</td>
<td>
{% for subject in examExeLine.subjectIds.all %}
{{ subject.initials }}
<br />
{% endfor %}
</td>
<td>
{% for subject in examExeLine.subjectIds.all %}
{{ subject.name }}
<br />
{% endfor %}
</td>
<td>
{% for subject in examExeLine.subjectIds.all %}
{{ subject.identification }}
<br />
{% endfor %}
</td>
<td>{{ examExeLine.examStudCound|default_if_none:'' }}</td>
<td>{{ examExeLine.supervisorType }}</td>
</tr>
<tr class="accordian-body collapse" id="{{ forloop.counter }}">
<td colspan="9">
<div>
<table class="table-nostriped"
cellpadding="5"
cellspacing="0"
border="0"
style="padding-left: 50px">
<tr>
<td>Aufsichtspersonen:</td>
<td>
{% for examExecutions in examExeLine.executionSet %}
{{ examExecutions.lecturer.firstName }} {{ examExecutions.lecturer.lastName }}
<br />
{% endfor %}
</td>
</tr>
<tr>
<td>Prüfungskennung:</td>
<td>{{ examExeLine.partialExamIdent }}</td>
</tr>
</table>
</div>
</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
{% endfor %}
</tbody>
{% comment %}
<tfoot>
</tfoot>
{% endcomment %}
</table>
</div>
<script>
$("#lecturerExamTable").DataTable({
lengthMenu: [[-1], ["Alle"]],
ordering: false,
bInfo: false,
language: { url: "//cdn.datatables.net/plug-ins/1.10.24/i18n/German.json" }
});
</script>
{% endblock %}
{% comment %}
<tbody>
{% for examExeLine in lecExamExes %}
<tr data-toggle="collapse" data-target="#{{forloop.counter}}" class="accordion-toggle">
<td>
{{ examExeLine.partialExam.exam.date|date:"d.m.Y" }} {{
examExeLine.partialExam.exam.time|date:"H:i" }}
</td>
<td>{{ examExeLine.partialExam.exam.weekday }}</td>
<td>{{ examExeLine.location }}</td>
{% endblock %} {% comment %}
<tbody>
{% for examExeLine in lecExamExes %}
<tr data-toggle="collapse" data-target="#{{forloop.counter}}" class="accordion-toggle">
<td>
{{ examExeLine.partialExam.exam.date|date:"d.m.Y" }} {{
examExeLine.partialExam.exam.time|date:"H:i" }}
</td>
<td>{{ examExeLine.partialExam.exam.weekday }}</td>
<td>{{ examExeLine.location }}</td>
<td>
{% for subject in examExeLine.subjectIds.all %}{{ subject.initials }}<br />{% endfor %}
</td>
<td>{{ examExeLine.partialExam.identification }}</td>
<td>
{% for subject in examExeLine.subjectIds.all %}{{ subject.name }}<br />{% endfor %}
</td>
<td>
{% for subject in examExeLine.subjectIds.all %} {{ subject.identification
}}<br />
{% endfor %}
</td>
<td>
{% for subject in examExeLine.subjectIds.all %} {{ subject.initials }}<br />
{% endfor %}
</td>
<td>{{ examExeLine.partialExam.identification }}</td>
<td>
{% for subject in examExeLine.subjectIds.all %} {{ subject.name }}<br />
{% endfor %}
</td>
<td>
{% for subject in examExeLine.subjectIds.all %} {{ subject.identification
}}<br />
{% endfor %}
</td>
<td>{{ examExeLine.partialExam.regStudCount }}</td>
<td>{{ examExeLine.supervisorType }}</td>
</tr>
<tr class="accordian-body collapse" id="{{forloop.counter}}">
<td colspan="9">
<div>
<table class="table-nostriped" cellpadding="5" cellspacing="0" border="0" style="padding-left: 50px">
<tr>
<td>Aufsichtspersonen:</td>
<td>
{% for examExecutions in
examExeLine.partialExam.examexecution_set.all %} {{
examExecutions.lecturer.firstName }} {{
examExecutions.lecturer.lastName }}<br />
{% endfor %}
</td>
</tr>
<tr>
<td>Prüfungskennung:</td>
<td>{{ examExeLine.partialExam.exam.identification }}</td>
</tr>
</table>
</div>
</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
{% endfor %}
</tbody>
<td>{{ examExeLine.partialExam.regStudCount }}</td>
<td>{{ examExeLine.supervisorType }}</td>
</tr>
<tr class="accordian-body collapse" id="{{ forloop.counter }}">
<td colspan="9">
<div>
<table class="table-nostriped" cellpadding="5" cellspacing="0" border="0" style="padding-left: 50px">
<tr>
<td>Aufsichtspersonen:</td>
<td>
{% for examExecutions in
examExeLine.partialExam.examexecution_set.all %}
{{
examExecutions.lecturer.firstName }} {{
examExecutions.lecturer.lastName }}
<br />
{% endfor %}
</td>
</tr>
<tr>
<td>Prüfungskennung:</td>
<td>{{ examExeLine.partialExam.exam.identification }}</td>
</tr>
</table>
</div>
</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
{% endfor %}
</tbody>
{% endcomment %}
+5
View File
@@ -0,0 +1,5 @@
{% extends 'base.html' %}
{% block content %}
Lesen der Json-Dateien und eintragen in die Datenbank abgeschlossen
{% endblock %}
+42
View File
@@ -0,0 +1,42 @@
{% extends 'pruefplan/tableBase.html' %}
{% load static %}
{% block title %}Prüfungsplan - Ansicht Studierende{% endblock %}
{% block table %}
<h3>Prüfungsplan - Ansicht Studierende</h3>
<div class="container mb-3 mt-3" >
<table id="studentTable" class="display" style="width: 100%">
<thead>
<tr>
<th>Matrikelnummer</th>
<th>Prüfungen</th>
</tr>
</thead>
<tbody>
{% for student in students %}
<tr>
<td>{{ student.matrikel }}</td>
<td>
<a href="{% url 'pp_viewer:examForStudent' student_id=student.matrikel %}" role="button" class="btn btn-outline-warning">
<img src="{% static 'open-iconic/svg/list.svg' %}" alt="Prüfungen" width="20" height="20" >
</a>
</td>
</tr>
{% endfor %}
</tbody>
<tfoot>
</tfoot>
</table>
</div>
<script>
var studentTable = $('#studentTable').DataTable({
"lengthMenu": [[10, 25, 50, -1], [10, 25, 50, "All"]],
"language": { url: '//cdn.datatables.net/plug-ins/1.10.24/i18n/German.json'}
});
</script>
{% endblock %}
@@ -0,0 +1,70 @@
{% extends 'pruefplan/tableBase.html' %}
{% block additionalScript %}
<script>
$.fn.dataTable.moment( 'DD.MM.YYYY' );
</script>
{% endblock %}
{% block table %}
<div class="container mb-3 mt-3" >
<h3>Prüfungsplan - Matrikelnummer: {{ student.matrikel}}</h3>
<p>Hinweis: Sie können mit einem Bookmark auf diese Seite jederzeit auf Ihren Prüfungsplan zugreifen.</p>
<table id="studentExamTable" class="display table-striped" style="width: 100%">
<thead>
<tr>
<th>Datum</th>
<th>Uhrzeit</th>
<th>Wochentag</th>
<th>Raum</th>
<th>Fachkennung</th>
<th>Fächer</th>
<th>Aufsichtsperson</th>
<th>Fächerbezeichung</th>
<th>Teilpfrüfung</th>
</tr>
</thead>
<tbody>
{% for exam in exams %}
<tr>
<td>{{ exam.date|date:"d.m.Y" }}</td>
<td>{{ exam.time|date:"H:i" }}</td>
<td>{{ exam.weekday }}</td>
<td>{{ exam.location }}</td>
<td>
{% for subject in exam.examExecution.subjectIds.all %}
{{ subject.initials }}<br/>
{% endfor %}
</td>
<td>{{ exam.examExecution.partialExam.identification }}</td>
<td>{{ exam.examExecution.lecturer.firstName }} {{ exam.examExecution.lecturer.lastName }}</td>
<td>
{% for subject in exam.examExecution.subjectIds.all %}
{{ subject.name }}<br/>
{% endfor %}
</td>
<td>
{% for subject in exam.examExecution.subjectIds.all %}
{{ subject.identification }}<br/>
{% endfor %}
</td>
</tr>
{% endfor %}
</tbody>
<tfoot>
</tfoot>
</table>
</div>
<script>
$('#studentExamTable').DataTable({
"lengthMenu": [[10, 25, 50, -1], [10, 25, 50, "All"]],
"language": { url: '//cdn.datatables.net/plug-ins/1.10.24/i18n/German.json'}
});
</script>
{% endblock %}
+39
View File
@@ -0,0 +1,39 @@
{% extends 'pruefplan/tableBase.html' %}
{% block title %}Prüfungsplan - Ansicht Fächer{% endblock %}
{% block table %}
<h3>Prüfungsplan - Ansicht Fächer</h3>
<div class="container mb-3 mt-3" >
<table id="subjectTable" class="display" style="width: 100%">
<thead>
<tr>
<th>Identification</th>
<th>Initials</th>
<th>Name</th>
</tr>
</thead>
<tbody>
{% for sub in subjects %}
<tr>
<td>{{ sub.identification }}</td>
<td>{{ sub.initials }}</td>
<td>{{ sub.name }}</td>
</tr>
{% endfor %}
</tbody>
<tfoot>
</tfoot>
</table>
</div>
<script>
$('#subjectTable').DataTable({
"lengthMenu": [[10, 25, 50, -1], [10, 25, 50, "All"]],
"language": { url: '//cdn.datatables.net/plug-ins/1.10.24/i18n/German.json'}
});
</script>
{% endblock %}
@@ -0,0 +1,23 @@
{% extends 'base.html' %}
{% block title %}Prüfungsplan{% endblock %}
{% block content %}
<!--Bootstrap sortable table-->
<script src="https://code.jquery.com/jquery-3.5.1.js"></script>
<script src="https://cdn.datatables.net/1.10.22/js/jquery.dataTables.min.js"></script>
<!--Sort DateTime-->
<script src="https://momentjs.com/downloads/moment.js" type="text/javascript"></script>
<script src="http://cdn.datatables.net/plug-ins/1.10.9/sorting/datetime-moment.js"></script>
<!--Sort custom enum data e.g. weekday-->
<script src="https://cdn.datatables.net/plug-ins/1.10.21/sorting/enum.js"></script>
<script>
$.fn.dataTable.enum( [ 'MONTAG', 'DIENSTAG', 'MITTWOCH', 'DONNERSTAG', 'FREITAG', 'SAMSTAG', 'SONNTAG' ] );
</script>
{% block additionalScript %}{% endblock %}
{% block table %}{% endblock %}
{% endblock %}
+31
View File
@@ -0,0 +1,31 @@
{% extends 'base.html' %}
{% block title %}Prüfungsplan{% endblock %}
{% block content %}
<h3>Hochladen der JSON-Dateien</h3>
<div style="padding:20px;">
<form action="upload_file" method="post" enctype="multipart/form-data">
{% csrf_token %}
Dozenten:
{{ form.lecturers_file }}
<br />
<br />
Faecher:
{{ form.subjects_file }}
<br />
<br />
Präsenzen:
{{ form.attendance_file }}
<br />
<br />
Pruefungen:
{{ form.exams_file }}
<br />
<br />
Saaleinteilung:
{{ form.student_file }}
<br />
<br />
<button type="submit">Upload</button>
</form>
</div>
{% endblock %}
@@ -0,0 +1,7 @@
{% extends "base.html" %}
{% block content %}
<p>Logged out!</p>
<a href="{% url 'login'%}">Click here to login again.</a>
{% endblock %}
+36
View File
@@ -0,0 +1,36 @@
{% extends "base.html" %}
{% block content %}
{% if form.errors %}
<p>Your username and password didn't match. Please try again.</p>
{% endif %}
{% if next %}
{% if user.is_authenticated %}
<p>Your account doesn't have access to this page. To proceed,
please login with an account that has access.</p>
{% else %}
<p>Please login to see this page.</p>
{% endif %}
{% endif %}
<form method="post" action="{% url 'login' %}">
{% csrf_token %}
<div>
<td>{{ form.username.label_tag }}</td>
<td>{{ form.username }}</td>
</div>
<div>
<td>{{ form.password.label_tag }}</td>
<td>{{ form.password }}</td>
</div>
<div>
<input type="submit" value="login" />
<input type="hidden" name="next" value="{{ next }}" />
</div>
</form>
{% endblock %}