Python Django html templating
Я создаю веб-портфолио для альбомов фотографий и других функций, но html-шаблоны немного запутанны для меня, у меня есть несколько различных вопросов, связанных с этой темой. Вот мои модели:
class Album(models.Model):
title = models.CharField(max_length=150)
date_init = models.DateField("From", default=date.today)
date_end = models.DateField("To", default=date.today)
album_cover = models.ForeignKey('Photo', null=True, blank=True, on_delete=models.RESTRICT, related_name='Album')
class Photo(models.Model):
image = models.ImageField(upload_to="photos/")
alt_text = models.CharField(max_length=100)
album = models.ForeignKey(Album, on_delete=models.CASCADE, related_name='photos')
tags = TaggableManager(blank=True)
1- У меня есть Navbar в base.html :
{% block sidebar %}
...
<ul class="dropdown-menu" aria-labelledby="navbarDropdown">
<li><a class="dropdown-item" href="#">2021</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" href="#">2018</a></li>
<li><a class="dropdown-item" href="#">2014</a></li>
...
{% endblock %}
</ul>
Моя идея состоит в том, чтобы показывать только те годы, для которых в базе данных сохранен хотя бы один альбом (например, исключить 2020 и 2019, потому что там нет данных). Но моя проблема в том, что этот код находится в base.html, который я распространяю повсюду. Я знаю, что могу изменить его с помощью {% block sidebar %}, но эта информация должна быть во всех шаблонах. Если я прав, я не могу отправлять данные в base.html для заполнения списка? Есть ли способ добиться этого без копирования/вставки кода во все html шаблоны? Если нужно, мой запрос к базе данных :
Album.objects.dates('date_init', 'year')
2/ В моей галерее все альбомы показаны с множественной информацией :
<main>
<div class="album py-5 bg-light">
<div class="container">
<div class="row row-cols-1 row-cols-sm-2 row-cols-md-3 g-3">
{% if data %}
{% for album in data %}
<div class="col">
<div class="card shadow-sm h-100">
<div class="card-header h-100">
<a href="{% url 'album' album.id %}"><img src="{{ album.album_cover.image.url }}" class="img-fluid img-thumbnail card-img-top thumbnail-bg-dark"/></a>
</div>
<div class="card-body">
<h8 class="card-title"><a href="{% url 'album' album.id %}">{{album.title}}</a></h8>
<p class="card-text"><em><small class="text-muted">
{% if album.tags_list|length %}
{{album.tags_list.all|join:", "}}
{% else %}
<del>No tags added</del>
{% endif %}
</small></em></p>
</div>
<div class="card-footer">
<div class="d-flex justify-content-between align-items-center">
{% if album.num_photos > 1 %}
<small class="text-muted"><em>{{ album.num_photos }} photos</em></small>
{% else %}
<small class="text-muted text-start"><em>{{ album.num_photos }} photo</em></small>
{% endif %}
<small class="text-muted text-end"><em>{{ album.date_init }}</em></small>
</div>
</div>
</div>
</div>
{% endfor %}
{% endif %}
</div>
</div>
</div>
</main>
- Я хочу, чтобы изображения были выровнены по центру верхней карточки, даже если у них разное соотношение (правое должно быть немного ниже), но не знаю, как это сделать (пробовал vertical-align и другие штуки). Мне нужно выровнять все элементы (заголовок, теги, фотографии и дату можно). .
- Также для тегов, возможно ли добавить ссылку href для каждого тега с подобной конструкцией (фактически это только текст)? .
- И ограничить количество тегов до 1 строки текста и при необходимости заменить конец на "..." ? Для этой страницы мой запрос выглядит так :
albums = Album.objects.order_by('-date_init').annotate(num_photos=Count('photos'), year=ExtractYear('date_init'),)
for album in albums:
tag_lists = Tag.objects.filter(photo__album=album).distinct().annotate(num_tags=Count('slug')).order_by('-num_tags')
album.tags_list = tag_lists
print(album.tags_list)
Мне было трудно найти примеры или объяснения по шаблонированию html на python, и я не нахожу этот язык легким для понимания, так что если у вас есть хорошие учебники или уроки, это может быть полезно :) Спасибо за помощь и счастливого Рождества!