0

0

使用 HTMX 和 Django 创建待办事项应用程序,部分无限滚动

碧海醫心

碧海醫心

发布时间:2025-01-07 14:24:04

|

805人浏览过

|

来源于php中文网

原创

本教程是学习使用 django 和 htmx 实现无限滚动的第七部分。我们将遵循 htmx 文档,逐步实现待办事项列表的无限滚动功能。完整系列教程可在 dev.to/rodbv 查看。

更新部分模板以支持多项目加载

实现无限滚动需要一次返回多个待办事项(项目的下一页),并将其加载到现有部分模板中。这需要修改部分模板的结构。当前模板渲染单个待办事项,如下图所示:

使用 HTMX 和 Django 创建待办事项应用程序,部分无限滚动

我们需要调整结构,使部分模板包含循环:

使用 HTMX 和 Django 创建待办事项应用程序,部分无限滚动

修改 core/templates/index.html 模板:

{% partialdef todo-items-partial inline %}
  {% for todo in todos %}
    
  {% endfor %}
{% endpartialdef %}

接下来,我们将添加 hx-gethx-trigger="revealed" 属性来实现无限滚动,但首先,我们需要修改视图函数,使其返回多个项目而不是单个项目:

...之前的代码...

def _create_todo(request):
    title = request.POST.get("title")
    if not title:
        raise ValueError("title is required")

    todo = Todo.objects.create(title=title, user=request.user)

    return render(
        request,
        "tasks.html#todo-items-partial", # ...
    )

...之后的代码...

测试显示内容仍然正确,页面外观也一致,这表明我们为实现无限滚动打好了基础。

实现无限滚动

在模板中,我们需要向 /tasks 发送一个 hx-get 请求,并设置 hx-trigger="revealed",这意味着只有当元素即将进入屏幕可见区域时才触发 get 请求。我们需要将其添加到列表的最后一个元素之后,并指定要加载的“页面”数据。在本例中,我们一次显示 20 个项目。

使用 HTMX 和 Django 创建待办事项应用程序,部分无限滚动

修改模板:

{% partialdef todo-items-partial inline %}
  {% for todo in todos %}
    
  {% endfor %}
  {% if next_page_number %}
    
  {% endif %}
{% endpartialdef %}

列表底部的“加载中”图标由 if next_page_number 条件控制,它有两个作用:指示何时加载更多数据,以及何时显示加载器(当加载器进入可见区域时)。它将触发对 /taskshx-get 调用,并传递要检索的页码。next_page_number 属性由上下文提供。

极限网络办公Office Automation
极限网络办公Office Automation

专为中小型企业定制的网络办公软件,富有竞争力的十大特性: 1、独创 web服务器、数据库和应用程序全部自动傻瓜安装,建立企业信息中枢 只需3分钟。 2、客户机无需安装专用软件,使用浏览器即可实现全球办公。 3、集成Internet邮件管理组件,提供web方式的远程邮件服务。 4、集成语音会议组件,节省长途话费开支。 5、集成手机短信组件,重要信息可直接发送到员工手机。 6、集成网络硬

下载

hx-swap:outerhtml 属性指示我们将用从服务器获取的新数据替换该元素的 outerhtml 内容,这很好,因为我们不仅显示了新数据,还移除了加载图标。现在我们可以修改视图文件。

/tasks 视图函数当前总是返回完整的模板:

@require_http_methods(["get", "post"])
@login_required
def tasks(request):
    if request.method == "post":
        return _create_todo(request)

    # get /tasks
    context = {
        "todos": request.user.todos.all().order_by("-created_at"),
        "fullname": request.user.get_full_name() or request.user.username,
    }

    return render(request, "tasks.html", context)

代码已修改为按最新待办事项优先排序;对于较长的列表,在底部添加新项目并与无限滚动混合是没有意义的——新项目最终会出现在列表中间。

我们需要区分常规 get 请求和 htmx 请求,为此,我们将只返回待办事项列表和部分模板。可以使用 django-htmx 库简化操作,但目前我们只需检查 htmx 头部并使用 Django 分页器处理分页。

# core/views.py

...之前的代码...

PAGE_SIZE = 20

...之前的代码...

@require_http_methods(["get", "post"])
@login_required
def tasks(request):
    if request.method == "post":
        return _create_todo(request)

    page_number = int(request.GET.get("page", 1))

    all_todos = request.user.todos.all().order_by("-created_at")
    paginator = Paginator(all_todos, PAGE_SIZE)
    curr_page = paginator.get_page(page_number)

    context = {
        "todos": curr_page.object_list,
        "fullname": request.user.get_full_name() or request.user.username,
        "next_page_number": page_number + 1 if curr_page.has_next() else None,
    }

    template_name = "tasks.html"

    if "hx-request" in request.headers:
        template_name += "#todo-items-partial"

    return render(request, template_name, context)

首先,我们检查 page 参数,如果不存在则将其设置为 1。

然后,我们检查请求中的 hx-request 头部,这将告知我们请求是否来自 htmx,并让我们相应地返回部分模板或完整模板。

这段代码需要测试,但在测试之前,让我们先尝试一下。观察网络工具,看看页面滚动时如何触发请求,直到到达最后一页。您还可以看到动画“加载中”图标短暂显示;我已将网络速度限制为 4g,以使其可见时间更长。

使用 HTMX 和 Django 创建待办事项应用程序,部分无限滚动

添加测试

最后,我们可以添加测试来确保分页按预期工作:

# core/tests/test_view_tasks.py

...之前的测试...

@pytest.mark.django_db
def test_tasks_pagination(client, make_todo, make_user):
    user = make_user()
    client.force_login(user)

    # 创建两页数据
    for i in range(PAGE_SIZE + 3):
        make_todo(title=f"Todo #{i}", user=user)

    response = client.get(reverse("tasks"))

    context = response.context
    assert context["next_page_number"] == 2
    assert len(context["todos"]) == PAGE_SIZE

    # 添加头部以确保将其作为 HTMX 请求处理
    response = client.get(reverse("tasks") + "?page=2", HTTP_HX_Request="true")

    content = response.content.decode().strip()
    assert content.startswith("<") # ...

现在就完成了!这是迄今为止我使用 htmx 最有趣的体验。本文的完整代码在这里。

下一篇文章,我可能会考虑使用 Alpine.js 添加一些客户端状态管理,或者添加“截止日期”功能。敬请期待!

相关专题

更多
html版权符号
html版权符号

html版权符号是“©”,可以在html源文件中直接输入或者从word中复制粘贴过来,php中文网还为大家带来html的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

593

2023.06.14

html在线编辑器
html在线编辑器

html在线编辑器是用于在线编辑的工具,编辑的内容是基于HTML的文档。它经常被应用于留言板留言、论坛发贴、Blog编写日志或等需要用户输入普通HTML的地方,是Web应用的常用模块之一。php中文网为大家带来了html在线编辑器的相关教程、以及相关文章等内容,供大家免费下载使用。

638

2023.06.21

html网页制作
html网页制作

html网页制作是指使用超文本标记语言来设计和创建网页的过程,html是一种标记语言,它使用标记来描述文档结构和语义,并定义了网页中的各种元素和内容的呈现方式。本专题为大家提供html网页制作的相关的文章、下载、课程内容,供大家免费下载体验。

458

2023.07.31

html空格
html空格

html空格是一种用于在网页中添加间隔和对齐文本的特殊字符,被用于在网页中插入额外的空间,以改变元素之间的排列和对齐方式。本专题为大家提供html空格的相关的文章、下载、课程内容,供大家免费下载体验。

241

2023.08.01

html是什么
html是什么

HTML是一种标准标记语言,用于创建和呈现网页的结构和内容,是互联网发展的基石,为网页开发提供了丰富的功能和灵活性。本专题为大家提供html相关的各种文章、以及下载和课程。

2856

2023.08.11

html字体大小怎么设置
html字体大小怎么设置

在网页设计中,字体大小的选择是至关重要的。合理的字体大小不仅可以提升网页的可读性,还能够影响用户对网页整体布局的感知。php中文网将介绍一些常用的方法和技巧,帮助您在HTML中设置合适的字体大小。

500

2023.08.11

html转txt
html转txt

html转txt的方法有使用文本编辑器、使用在线转换工具和使用Python编程。本专题为大家提供html转txt相关的文章、下载、课程内容,供大家免费下载体验。

306

2023.08.31

html文本框代码怎么写
html文本框代码怎么写

html文本框代码:1、单行文本框【<input type="text" style="height:..;width:..;" />】;2、多行文本框【textarea style=";height:;"></textare】。

419

2023.09.01

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

7

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 0.6万人学习

Django 教程
Django 教程

共28课时 | 2.6万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.0万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号