Проблема наследования шаблонов Django: {% if %} Блок не отображается при расширении base.html
Описание проблемы
Я работаю над проектом Django, где у меня есть форма, которая при отправке вычисляет некоторые результаты и отображает их на той же странице. Проблема возникает, когда я использую базовый шаблон (base.html
). Без использования base.html
все работает отлично, и результаты отображаются корректно. Однако, когда я расширяюсь из base.html
, содержимое блока {% if results %}{% endif %}
в моем шаблоне test.html
вообще не отображается.
base.html
Вот мой base.html
:
<!DOCTYPE html>
<html>
<head>
<title>{% block title %}AbiturTest{% endblock %}</title>
{% load static %}
<link rel="stylesheet" type="text/css" href="{% static 'main/css/style.css' %}">
<link rel="icon" type="image/x-icon" href="{% static 'main/img/icon.ico' %}">
<link rel="apple-touch-icon" href="{% static 'main/img/icon.png' %}">
<link rel="shortcut icon" href="{% static 'main/img/icon.ico' %}">
</head>
<body>
<header>
<nav>
<ul>
<li><a href="{% url 'home' %}">Home</a></li>
<li><a href="{% url 'test' %}">Test</a></li>
</ul>
</nav>
</header>
<div class="container">
{% block content %}{% endblock %}
</div>
</body>
</html>
test.html
Вот мой test.html
:
{% extends 'main/base.html' %}
{% block title %}Test - AbiturTest{% endblock %}
{% block content %}
<h1>Тест AbiturTest</h1>
<form id="test-form" method="post">
{% csrf_token %}
<ul>
{% for question in questions %}
<li>{{ question.text }}
<div class="radio-buttons">
<input type="radio" id="q{{ question.id }}_1" class="radio-button" name="answer_{{ question.id }}" value="1" required>
<label for="q{{ question.id }}_1" class="radio-label">Полностью не согласен</label>
<input type="radio" id="q{{ question.id }}_2" class="radio-button" name="answer_{{ question.id }}" value="2">
<label for="q{{ question.id }}_2" class="radio-label">Не согласен</label>
<input type="radio" id="q{{ question.id }}_3" class="radio-button" name="answer_{{ question.id }}" value="3">
<label for="q{{ question.id }}_3" class="radio-label">Нейтрально</label>
<input type="radio" id="q{{ question.id }}_4" class="radio-button" name="answer_{{ question.id }}" value="4">
<label for="q{{ question.id }}_4" class="radio-label">Согласен</label>
<input type="radio" id="q{{ question.id }}_5" class="radio-button" name="answer_{{ question.id }}" value="5">
<label for="q{{ question.id }}_5" class="radio-label">Полностью согласен</label>
</div>
</li>
{% endfor %}
</ul>
<button type="submit" id="submit-button" class="button" disabled>Отправить</button>
</form>
{% if results %}
<div id="result-overlay" class="result-overlay">
<h2>Результаты:</h2>
<ul>
{% for result in results %}
<li>{{ result.profession }}: {{ result.percentage }}%</li>
{% endfor %}
</ul>
<a href="{% url 'test' %}" class="button enabled">Пройти тест еще раз</a>
</div>
{% endif %}
{% endblock %}
views.py
Вот представление, которое обрабатывает форму и отображает шаблон test.html
:
from django.shortcuts import render
import json
from django.conf import settings
def home(request):
return render(request, 'main/index.html')
def test(request):
if request.method == 'POST':
with open(settings.JSON_FILE_PATH) as f:
data = json.load(f)
questions = data['questions']
relations = data['relations']
total_scores = {profession['id']: 0 for profession in data['professions']}
# Сбор ответов и расчет баллов
for question in questions:
question_id = question['id']
answer = int(request.POST.get(f'answer_{question_id}'))
for profession_id, relation in relations[str(question_id)].items():
total_scores[profession_id] += answer * relation['relation']
# Нормализация баллов для расчета процентов
total_sum = sum(total_scores.values())
percentages = {profession_id: (score / total_sum) * 100 for profession_id, score in total_scores.items()}
results = [
{"profession": next(profession['name'] for profession in data['professions'] if profession['id'] == profession_id), "percentage": percentage}
for profession_id, percentage in percentages.items()
]
return render(request, 'main/test.html', {'questions': questions, 'results': results})
else:
with open(settings.JSON_FILE_PATH) as f:
data = json.load(f)
questions = data['questions']
return render(request, 'main/test.html', {'questions': questions})
Проблема
Без использования base.html
результаты корректно отображаются в test.html
. Однако, когда я расширяюсь из base.html
, содержимое блока {% if results %}{% endif %}
вообще не отображается. Похоже, что переменная results
не распознается при использовании базового шаблона.
Что может быть причиной этой проблемы и как ее решить?
Изначально я создал отдельный шаблон для теста (test.html) без расширения какого-либо базового шаблона. Этот отдельный шаблон корректно отображает результаты в блоке {% if results %}{% endif %} после отправки формы.
попробуйте поместить это {% load static %}
в верхней части base.html, а не внутри