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 для передачи дополнительной информации и отображения ее на странице. Мой шаг был следующим:

  1. Создал файл context_processors.py в моем каталоге приложений.

  2. Создал функцию def get_notifications_number(request), в которой отфильтровал то, что я хочу отобразить в base.html и вернул return {'answers': answers}

    .
  3. Наконец, я зарегистрировал файл в Django TEMPLATES 'my_app.context_processors.get_notifications_number'.

Вернуться на верх