Динамическое отображение отдельной страницы с помощью django и htmx

Работаю над простым приложением для задач, используя Django и HTMX. Я хочу, чтобы при нажатии пользователем на кнопку в навигационной панели для добавления задачи, страница добавления задачи отображалась динамически, не вызывая перезагрузки страницы. Да, страница задачи отображается динамически, но когда я пытаюсь перезагрузить страницу, часть содержимого страницы теряется. Ниже приведены фрагменты кода

navbar.html

{% load static %}

<div class="flex justify-between pt-10 pb-3">
    <div class="w-6/12">
        <div class="font-bold text-gray-700 text-2xl" style="cursor: pointer;">Task Manager</div>
    </div>
    <div class="w-1/12 text-gray-500" style="cursor: pointer;">Home</div>
    <div class="w-1/12 text-gray-500" style="cursor: pointer;">Pending</div>
    <div class="w-1/12 text-gray-500" style="cursor: pointer;">Complete</div>
    <div class="w-1/12 text-gray-500" style="cursor: pointer;">Pricing</div>
    <div class="w-1/12 text-gray-500">
        <div class="flex justify-center items-center">
        <a role="button" class="bg-blue-700 rounded text-white font-bold text-sm px-4 py-1" href="{% url "create_todo" %}" hx-get="{% url "create_todo" %}" hx-push-url="true" hx-target="#main">Add Task</a>
        </div>
    </div>
    <div class="w-1/12 text-gray-500">
        <div class="flex justify-center items-center">
            <img src="{% static 'images/me.jpg' %}" alt="Profile" srcset="" class="rounded-full w-12 h-12">
        </div>  
    </div>
</div>
<hr>

home.html

{% extends "../base.html" %}

{% block title %}Home Board{% endblock title %}

{% block content %}
    {% include "./navbar.html" %}
    <div class="px-20" id="main">
        <div class="flex justify-between">
            <h3 class="mt-5 text-center text-xl text-gray-500 font-bold my-8">Today's Tasks</h3>
            <div class="flex justify-center items-center">
                <button class="bg-blue-700 rounded text-white font-bold text-sm px-4 py-1">View Calendar</button>
            </div>
        </div>
        <div class="flex">
            <div class="flex justify-center items-center">
                <button class="bg-blue-700 rounded text-white font-bold text-sm px-4 py-1">All</button>
            </div>
            <div class="flex justify-center items-center ml-4">
                <button class="bg-blue-700 rounded text-white font-bold text-sm px-4 py-1">Completed</button>
            </div>
            <div class="flex justify-center items-center ml-4">
                <button class="bg-blue-700 rounded text-white font-bold text-sm px-4 py-1">Incomplete</button>
            </div>
        </div>

        <div id="all-tasks">
            {% include "./todo-list.html" %}
        </div>
        <div id="completed-tasks">
        </div>
        <div id="incomplete-tasks">
        </div>
    </div>
            </form>
        </div> 
    </div>
<div>
    
</div>

{% endblock content %}

views.py

def create_todo(request):
    if request.method == "POST":
        title = request.POST.get("title")
        description = request.POST.get("description")
        due_date = request.POST.get("due_date")
        todo = Todo.objects.create(title=title, description=description, due_date=due_date)
        # todo.save()

        todos = Todo.objects.all().order_by("-id")
        context = {
            "todos": todos,
        }
        return render(request, "todo/todo-list.html", context)
    elif request.method == "GET":
        return render(request, "todo/add_task.html")

add_task.html

<div class="flex justify-center">
    <div class="w-full">New Task</div>
    <div>
        <label for="title">Task Title</label>
        <input type="text" name="title" id="title">
    </div>
</div>

Когда страница отображается, она выглядит следующим образом Изображение, показывающее страницу add_task, отображаемую динамически

Когда я пытаюсь перезагрузить страницу, ее содержимое меняется на Изображение страницы add_task после попытки перезагрузки

Я думал, что после перезагрузки страницы ее содержимое останется прежним

Способ решить эту проблему - предоставить весь html-шаблон при выполнении "не-htmx" запроса.

Так что, на ваш взгляд, проверьте, запускается ли запрос через htmx, и если нет, используйте другой шаблон (тот, который включает add_task.html и расширяется из base.html)

elif request.method == "GET":
    if request.headers.get("HX-Request") == "true":
        return render(request, "todo/add_task.html")
    
    return render(request, "todo/add_task_with_base.html")
Вернуться на верх