Django отображает переменную в другом шаблоне
У меня есть проект django, в котором есть два шаблона: notification.html и base.html. Используя метод get_context_data(), я отображаю количество ответов в notification.html. Я пытался использовать ту же переменную в base.html, но это не сработало. Я также создал CBV и использовал get_context_data(), чтобы передать ту же логику и отобразить ее в base.html, но это не работает. Как мне отобразить переменную в другом шаблоне?
Я не знаю, как передать 'answers.count' в base.html, если base.html не имеет представления (я создал его только сейчас, пытаясь отобразить эту переменную).
forum.views
class NotificationView(ListView):
model = Answer
template_name = 'forum/notification.html'
# If user visited the notification page - mark all answers as read
def get_queryset(self):
user = get_object_or_404(User, username=self.kwargs.get('username'))
question = Question.objects.filter(user=user)
answer_read = self.model.objects.filter(question__in=question)
answer_read.update(is_read=True)
return answer_read
def get_context_data(self, **kwargs):
context = super().get_context_data()
user = get_object_or_404(User, username=self.kwargs.get('username'))
question = Question.objects.filter(user=user)
context['answers_all'] = Answer.objects.filter(question__in=question).order_by('-date_posted')
context['answers'] = Answer.objects.filter(question__in=question, is_read=False)
return context
forum/notification.html
{% block content %}
<div class="container">
<b>УNotofocations: {{ answers.count }}</b>
{% for answer in answers_all %}
<div class="card mb-3 mt-2">
<div class="card-body">
<a href="{% url 'detail' answer.question.id %}" class="mb-2">Ответ на вопрос: {{ answer.question }}</a>
<p>{{ answer.detail }}</p>
<a href="{% url 'users_questions' answer.user.username %}">{{ answer.user.username }}</a>
<span class="ml-4">{{ answer.date_posted|naturalday }}</span>
</div>
</div>
{% endfor %}
</div>
{% endblock %}
main.views
class BaseView(TemplateView):
template_name = 'main/base.html'
def get_context_data(self, **kwargs):
context = super().get_context_data()
user = get_object_or_404(User, username=self.kwargs.get('username'))
question = Question.objects.filter(user=user)
context['answers'] = Answer.objects.filter(question__in=question)
return context
main/base.html
{% if user.is_authenticated %}
{% if answers.count < 1 %}
<a href="{% url 'notification' user.username %}" class="bell text-light mr-3" id="btn-bell"><i class="fas fa-bell"></i></a>
{% else %}
<a href="{% url 'notification' user.username %}" class="bell text-light mr-3" id="btn-bell"><i class="fas fa-bell"></i><span class="pending">{{ answers.count }}</span></a>
{% endif %}
{% endif %}
угадайте, что вам не хватает только встроенных тегов шаблонов
в forum/notification.html
{% extends "base.html" %}
в main/base.html
{% block content %}{% endblock %}
https://docs.djangoproject.com/en/4.1/ref/templates/builtins/#extends
https://docs.djangoproject.com/en/4.1/ref/templates/language/#template-inheritance
Наконец, я решил эту проблему. Идея заключалась в том, чтобы отобразить переменную из context_data в base.html. Поскольку get_context_data
не помог, я нашел решение в документации Django. Решение оказалось настолько простым, что я надеюсь сэкономить время другим ученикам, если у них возникнет такая же проблема.
Я использовал context_processors.py
для передачи дополнительной информации и отображения ее на странице. Мой шаг был следующим:
Создал файл
context_processors.py
в моем каталоге приложений.Создал функцию
.def get_notifications_number(request)
, в которой отфильтровал то, что я хочу отобразить в base.html и вернулreturn {'answers': answers}
Наконец, я зарегистрировал файл в Django TEMPLATES
'my_app.context_processors.get_notifications_number'
.