Base.html показывает контекстные данные только на главной странице

У меня есть ListView для моей домашней страницы, который отображает дополнительные данные с помощью метода get_context_data. Это работает, но только в url HomeView, домашней страницы, а не в других шаблонах после того, как я расширил файл base.html. Все остальное в base отображается, единственное, что не отображается - это контекстные данные.

HomeView

class HomeView(ListView):
    model = Product
    context_object_name='products'
    template_name = 'main/home.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        news = News.objects.all()
        ...
        context.update({
            'news' : news,
            ...
        })
        
        return context

base.html

{% load static %}
<body>
    <div class="navbar">
        <a id="title" href="{% url 'home' %}">home</a>
    </div>

    ...

    <div class="side-bar">
        <div class="article">
            <h3>News</h3>
            {% for new in news %}
                <p>{{ new.title }}</p>
            {% endfor %}
            <a href="{% url 'news' %}"><p>See more</p></a>
        </div>
    </div>
    {% block content %}{% endblock %}

    ...

</body>

home.html

{% extends 'main/base.html' %}
{% block content %}
<div>
    {% for product in products %}
        <p>Some text..</p>
    {% endfor %}
{% endblock content %}

Значит ли это, что я должен добавить метод get_context_data в каждое представление, которое у меня есть? Не является ли это слишком повторяющимся и трудноизменяемым?

Значит ли это, что я должен добавить метод get_context_data в каждое представление, которое у меня есть?

Нет, вам не нужно этого делать. HomeView.get_context_data(...) относится к домашней странице.

В вашем примере, похоже, вы хотите показывать новости на всех страницах (на всех страницах, использующих шаблон base.html). В таком случае я бы рекомендовал использовать templatetag для загрузки новостей.

См: https://docs.djangoproject.com/en/4.1/howto/custom-template-tags/


Вы бы сделали что-то вроде:

my_app/templatetags/news_tags.py

@register.inclusion_tag('includes/latest_news.html')
def latest_news(context):
    return {
        'news': News.objects.order_by("-published_at")[0:25],
    }

base.html:

{% load static %}
{% load news_tags %}

<body>
    <div class="navbar">
        <a id="title" href="{% url 'home' %}">home</a>
    </div>

    ...

    <div class="side-bar">
        {% latest_news %}
    </div>
    {% block content %}{% endblock %}

    ...

</body>

Совет: перезапустите runserver после добавления нового файла templatetag, чтобы он был найден.

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