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, чтобы он был найден.