Использование HTMX, hx-push-url
просто ищу подробные указания о том, как hx-push-url
поскольку я столкнулся с некоторыми проблемами и ищу какое-то направление. Я относительный новичок в Django и только начал использовать HTMX.
Цель. Я создаю простую галерею изображений и имею сетку миниатюр, я использую HTMX для загрузки списка изображений в этой галерее, когда пользователь нажимает на миниатюру.
Это работает хорошо, я использую Django-HTMX и условие if
в View
для обработки запроса HTMX, который передает частичный HTML на страницу миниатюр.
Проблема заключалась в том, что мой URL не менялся. Моя миниатюра http://127.0.0.1:8000/gallery/
и когда я нажимаю на галерею для просмотра изображений внутри, URL остается тем же, поэтому я использовал htmx-push-url, чтобы URL отображался как http://127.0.0.1:8000/gallery/news
. Это работает, и URL изменяется.
Далее, дальше.
У меня есть кнопка на странице списка изображений, которая возвращает вас на страницу миниатюр, но при ее использовании я получаю ошибку 404
, а также когда я обновляю страницу списка изображений, я получаю 404
. Очевидно, что для http://127.0.0.1:8000/gallery/news
не существует URL и вида. У меня просто нет идей, как это решить.
Когда я смотрю в консоли, я получаю HTMX-target error
при нажатии на кнопку назад, и ничего не происходит. И, как я уже сказал, при обновлении получаю 404.
Приведенный ниже код должен лучше объяснить ситуацию.
Модели
name = models.CharField(max_length=200, null=True)
description = models.CharField(max_length=200, null=True, blank=True,
help_text="Gallery description on gallery page")
slug = AutoSlugField(populate_from='name')
created = models.DateTimeField()
visable = models.BooleanField(default=False)
type = models.ForeignKey(Category, on_delete=models.CASCADE, null=True, blank=True)
image = models.ForeignKey('Media', on_delete=models.CASCADE)
album_images = models.ManyToManyField('Media', related_name="album_pictures")
class Media(models.Model):
timestamp = models.DateTimeField()
image = models.ImageField(upload_to="media")
order = models.IntegerField(default=0)
visable = models.BooleanField(default=True)
categories = models.ForeignKey(Category, on_delete=models.CASCADE, null=True, blank=True)
URLS (релевантные)
path("gallery/", views.GalleryView, name="gallery"),
Виды
def GalleryView(request):
if request.htmx:
slug = request.GET.get('slug')
pics = get_object_or_404(Albums, slug=slug)
context = {'pictures': Media.objects.filter(album_pictures=pics),
'description': Albums.objects.filter(slug=slug)}
return render(request, 'main/gallery-detail.html', context=context)
context = {'objects_list': Albums.objects.all()}
return render(request, 'main/gallery.html', context=context)
Галерея HTML {релевантный код)
<div class="gallery-body">
{% for img in objects_list %}
<div class="item col-xs-6 col-sm-6 col-md-4">
<figure class="overlay"> <a hx-post="{{ request.path }}?slug={{ img.slug }}"
hx-target=".gallery-body"
hx-swap="outerHTML"
hx-push-url="/gallery/{{ img.slug }}"
hx-headers='{"X-CSRFToken": "{{ csrf_token }}"}'>
{% endfor %}
Частица, которая вызывается для показа изображений в галереях.
<button class="btn btn-primary"
hx-get="{% url 'main:gallery' %}"
hx-target=".gallery-body"
hx-push-url="/gallery"
hx-headers='{"X-CSRFToken": "{{ csrf_token }}"}'>
<h6>Back to Gallery page</h6></button></div>