Ошибка, при переходе на страницу: KeyError at /teachers/dates/check_hours/redactor_check_hours ''
Всем доброго дня.
Пишу веб-сайт, столкнулся с проблемой перехода на страницу редактирования информации. Вообщем, у меня есть 2 шаблона:
- check_hours -> предназначен для просмотра записей за определенный месяц
- redactor_check_hours = предназначен для редактирования записей за определенный месяц
- dates -> предназначена для выбора месяца
views.check_hours
def check_hours(request):
teacher = request.user.id
month = request.GET['month']
month_ = MonthModels.objects.get(name=months[month.lower()])
result = []
for i in TeacherLoadModel.objects.filter(teacher_id = teacher):
result.append({
'sem_id': i.semester_id.number_semester,
'group_name': i.group_id.name,
'teacher_name': i.teacher_id.first_name,
"subject_name": i.semester_id.subject_id.name,
"all_hours": i.semester_id.hours,
"hours": ["" for i in range(31)],
"sum": 0,
"ost": 0,
})
for j in i.hour.filter(month=month_):
result[-1]['hours'][j.day - 1] = j.value
result[-1]['sum'] += j.value
result[-1]['ost'] = result[-1]['all_hours'] - result[-1]['sum']
context = {
"result" : result,
"month": months[month.lower()],
}
return render(request, 'main/teacher/check_hours.html',context)
views.redactor_check_hours
def redactor_check_hours(request):
month = request.GET['month']
teacher = request.user.id
month_ = MonthModels.objects.get(name=months[month.lower()])
if request.method == 'POST':
data = dict(request.POST)
index = 0
s = 0
teacher_load = TeacherLoadModel.objects.get(
teacher_id = teacher,
semester_id__subject_id__name=data['subject'][s],
group_id__name=data['group_name'][s],
)
for i in data['sessionNum']:
if i.isdigit():
try:
for j in teacher_load.hour.filter(month=month_, day=index+1):
teacher_load.hour.remove(j)
except Hour.DoesNotExist:
print("err")
Hour.objects.get_or_create(
month=month_,
day=index+1,
value=int(i),
)
teacher_load.hour.add(Hour.objects.get(
month=month_,
day=index+1,
value=int(i),
))
if index == 30:
index = 0
s +=1
if s == len(data['subject']):
break
try:
teacher_load = TeacherLoadModel.objects.get(
teacher_id = teacher,
semester_id__subject_id__name=data['subject'][s],
group_id__name=data['group_name'][s],
)
except TeacherLoadModel.DoesNotExist:
print("##############################################")
else:
index+=1
groups = GroupModel.objects.all()
teacherload = TeacherLoadModel.objects.all()
semesters = SemesterModel.objects.all()
teachers = User.objects.all().exclude(first_name="")
subjects = SubjectModel.objects.all()
hours = SemesterModel.hours
result = []
for i in TeacherLoadModel.objects.filter(teacher_id = teacher):
result.append({
'sem_id': i.semester_id.number_semester,
'group_name': i.group_id.name,
'teacher_name': i.teacher_id.first_name,
"subject_name": i.semester_id.subject_id.name,
"all_hours": i.semester_id.hours,
"hours": ["" for i in range(31)],
"sum": 0,
"ost": 0,
})
for j in i.hour.filter(month=month_):
result[-1]['hours'][j.day - 1] = j.value
result[-1]['sum'] += j.value
result[-1]['ost'] = result[-1]['all_hours'] - result[-1]['sum']
context = {
"result" : result,
"month": months[month.lower()],
"month_": month,
}
return render(request, "main/teacher/redactor/redactor_check_hours.html", context)
views.dates
def dates(request):
if request.GET.get("month") is not None:
return check_hours(request)
return render(request, "main/teacher/dates.html")
При переходе со страницы check_hours на страницу redactor_check_hours, получаю ошибку:
KeyError at /teachers/dates/check_hours/redactor_check_hours ''
Я примерно понимаю, почему данная ошибка происходит, но не совсем понимаю как я могу её исправить, может быть кто сталкивался с такого рода ошибками.
Суть в том, что страница check_hours, открывается из вью dates, вью dates содержит в себе список месяцев. C помощью не сложной конструкции, я выполняю переход по конкретному месяцу, при этом в URL шаблона check_hours, дописывается наименование месяца и выглядит примерно так:
http://127.0.0.1:8000/teachers/dates/check_hours/redactor_check_hours?month=september
Но при переходе со страницы check_hours на redactor_check_hours, корректный URL адрес не формируется по какой то причине:
http://127.0.0.1:7000/teachers/dates/check_hours/redactor_check_hours?month=
Пример перехода на страницу check_hours из шаблона dates:
<li><button onclick="window.location.href='{% url "check_hours" %}?month=september'">Сентябрь</button></li>
Таким же образом пытаюсь перейти на страницу redactor_check_hours со страницы -> check_hours, но без успешно, пример:
<li><button onclick="window.location.href='{% url "redactor_check_hours" %}?month={{ month_ }}'">Изменить</button></li>
months - Список месяцев ['сентябрь','октябрь'....,'июнь']
ModelMonth - модель месяцев, которая содержит номер и наименование месяца.
template.check_hours
{% extends 'base.html' %}
{% block title %}Ведомость за {{month}}{% endblock %}
{% load static %}
{% block main %}
<main role="main">
<div class="menu-buttons-for-teacher-table">
<div class="buttons-table-right">
<ul>
<li><button id="printTable">Печать</button></li>
<li><button onclick="window.location.href='{% url "dates" %}'">Сменить месяц</button></li>
<li><button onclick="window.location.href='{% url "not_found_page" %}'">Сравнить</button></li>
<li><button onclick="window.location.href='{% url "redactor_check_hours" %}?month={{ month_ }}'">Изменить</button></li>
</ul>
</div>
</div>
<div class="head_load_sheet">
<h1>Ведомость {{user.first_name}} за {{month}}</h1>
</div>
<div class="table-teacher">
<table id="printMe">
<style>
@media print { /* Стили для печати */
#printMe .hidden { display:none; } /* что не надо печатать */
#printMe {
font-size:14px;
border: 1px solid #987;
border-collapse: collapse;
border-spacing: 0;
}
#printMe td,
#printMe th {
border: 1px solid #999;
}
}
</style>
<script src="https://code.jquery.com/jquery-3.4.1.min.js"
integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo="
crossorigin="anonymous">
</script>
<script>
jQuery(function ($) {
const tableToPrint = document.getElementById('printMe');
function printData(tableToPrint) {
Popup($(tableToPrint).html());
}
function Popup(data) {
const mywindow = window.open('', 'printMe', 'height=600, width=1000');
mywindow.document.write('<link rel="stylesheet" href="{% static "main/css/style.css" %}">');
mywindow.document.write(tableToPrint.outerHTML);
mywindow.document.close(); // для IE >= 10
mywindow.focus(); // для IE >= 10
mywindow.print();
mywindow.close();
return true;
}
$(document).on('click', '#printTable', function () {
printData();
return false;
});
});
</script>
<col style="width:2%">
<col style="width:30%">
<col style="width:10%">
<col style="width:2%">
<col style="width:2%">
<col style="width:2%">
<col style="width:2%">
<col style="width:2%">
<col style="width:2%">
<col style="width:2%">
<col style="width:2%">
<col style="width:2%">
<col style="width:2%">
<col style="width:2%">
<col style="width:2%">
<col style="width:2%">
<col style="width:2%">
<col style="width:2%">
<col style="width:2%">
<col style="width:2%">
<col style="width:2%">
<col style="width:2%">
<col style="width:2%">
<col style="width:2%">
<col style="width:2%">
<col style="width:2%">
<col style="width:2%">
<col style="width:2%">
<col style="width:2%">
<col style="width:2%">
<col style="width:2%">
<col style="width:2%">
<col style="width:2%">
<col style="width:2%">
<col style="width:2%">
<col style="width:2%">
<tr>
<td colspan="3"></td>
<td colspan="31">Ведомость учета часов преподавателей</td>
<td colspan="2"></td>
</tr>
<tr>
<td colspan="3">Фамилия и имя преподавателя: {{user.first_name}} {{user.last_name}}</td>
<td colspan="31">Месяц: Сентябрь</td>
<td colspan="2">Год: 2021</td>
</tr>
<tr>
<td rowspan="2">Группа</td>
<td rowspan="2">Предмет</td>
<td rowspan="2" >Всего часов</td>
<td colspan="31">Числа месяца</td>
<td rowspan="2" colspan="2">Дано часов за месяц</td>
</tr>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
<td>4</td>
<td>5</td>
<td>6</td>
<td>7</td>
<td>8</td>
<td>9</td>
<td>10</td>
<td>11</td>
<td>12</td>
<td>13</td>
<td>14</td>
<td>15</td>
<td>16</td>
<td>17</td>
<td>18</td>
<td>19</td>
<td>20</td>
<td>21</td>
<td>22</td>
<td>23</td>
<td>24</td>
<td>25</td>
<td>26</td>
<td>27</td>
<td>28</td>
<td>29</td>
<td>30</td>
<td>31</td>
</tr>
<tr>
{% for i in result %}
<tr>
{% if i.teacher_name == user.first_name %}
<td>{{ i.group_name }}</td>
<td>{{ i.subject_name }}</td>
<td>{{ i.sum }}</td>
{% for j in i.hours %}
<td>{{ j }}</td>
{% endfor %}
<td colspan="2">{{ i.all_hours }}</td>
{% endif %}
</tr>
{% endfor %}
</table>
</div>
</main>
{% endblock %}
После совета @ZaArs, на страницу -> redactor_hours, действительно стало переходить, но теперь я не могу вернуться со страницы redactor_hours на страницу check_hours, получаю ошибку:
MultiValueDictKeyError at /teachers/dates/check_hours/
'month'
При этом URL, уже формируется "почти корректно":
http://127.0.0.1:7000/teachers/dates/check_hours/?monthapril
UPD: Решил проблему, добавлением знака '=', после ?month, в шаблоне redactor_hours, пример:
<li><button onclick="window.location.href='{% url "check_hours" %}?month={{month_}}'">Вернуться</button></li>

