使用 Django 实现无限滚动

2025-06-07

使用 Django 实现无限滚动

这篇文章与OnePublish交叉发布

今天我将向你展示如何使用 Django 创建无限分页或无限滚动的快速教程

互联网上有很多与此主题相关的资料,但大多数都没有完整地解释。因此,我将尝试逐步清晰地为您解释。

好了!让我们发射无限滚动的 Django 火箭吧!

我假设你已经创建了你的项目

步骤 1:创建模型

我们将创建一个包含帖子的简单博客。让我们在models.py中创建帖子模型。

   from django.db import model

   class Post(models.Model):
     title = models.CharField(max_length=250)
     description = models.TextField()
     image = models.FileField(null=True, blank=True)

     def __str__(self):
         return self.title


Enter fullscreen mode Exit fullscreen mode

不要忘记迁移你的模型:)

第 2 步:创建视图

views.py中我们将导入ListView,它是一个基于类的视图,它将包含对象列表。

  from django.shortcuts import render
  from .models import Post
  from django.views.generic.list import ListView

  class PostsView(ListView):
      model = Post 
      paginate_by = 2
      context_object_name = 'posts'
      template_name = 'posts.html'
      ordering = ['title']
Enter fullscreen mode Exit fullscreen mode

如您所见,我将使用paginate_by属性每次滚动加载 2 篇文章,但您可以根据需要更改其数量。context_object_name属性指定从模板访问的变量名称。提供一个有用的 context_object_name 始终是个好主意。设计模板的同事会感谢您。此外,您可以按标题或发布日期对文章进行排序,但目前我们先按标题排序

步骤3:URL配置

是时候配置我们的urls.py了,所以让我们先看看代码。

  from django.contrib import admin
  from django.urls import path

  from posts.views import PostsView
  from django.conf import settings 
  from django.conf.urls.static import static 

  urlpatterns = [
      path('admin/', admin.site.urls),
      path('', PostsView.as_view(),  name="posts"),
  ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Enter fullscreen mode Exit fullscreen mode

在基于类的视图中,您必须调用 as_view() 函数才能返回一个可调用的视图,该视图接受请求并返回响应。对于通用视图,它是请求-响应周期的主要入口点。

只需提醒static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)用于提供媒体文件。

步骤 4:Waypoints JS 和模板

Waypoints 是一个小型 jQuery 插件,它可以让您在滚动到某个元素时轻松执行某个功能。

航点记录

好的!我们先看看代码


            <div class="container">
                <div class="row infinite-container">
                    {% for post in posts %}
                        <div class="col-md-6 infinite-item">
                            <div class="card mb-4 shadow-sm">
                                <img class="img-thumbnail"  src="{{post.image.url}}"/>
                                <div class="card-body">
                                    <h5>{{post.title}}</h5>
                                    <p class="card-text">
                                        {{post.description|truncatewords:20}}
                                    </p>
                                </div>
                            </div>
                        </div>
                    {% endfor %}
                </div>
                {% if page_obj.has_next %}
                <a class="infinite-more-link" href="?page={{ page_obj.next_page_number }}"></a>
                {% endif %}
                <div class="d-flex justify-content-center" style="display:none;">
                    <div class="spinner-border" role="status">
                        <span class="sr-only">Loading...</span>
                    </div>
                </div>
            </div>


    <script src="/static/js/jquery-2.2.4.min.js"></script>
    <script src="/static/js/jquery.waypoints.min.js"></script>
    <script src="/static/js/infinite.min.js"></script>
    <script>
    var infinite = new Waypoint.Infinite({
        element: $('.infinite-container')[0],
        handler: function(direction) {

    },
    offset: 'bottom-in-view',

    onBeforePageLoad: function () {
    $('.spinner-border').show();
    },
    onAfterPageLoad: function () {
    $('.spinner-border').hide();
    }

    });

    </script>


Enter fullscreen mode Exit fullscreen mode

这是本教程的重点部分,我们首先要添加jquery-2.2.4.min.js。最好添加 2.2.4 版本的 jQuery,否则会报错。然后添加jquery.waypoints.min.jsinfinite.min.js。

您可以直接从 waypoints 的 github repo 获取脚本。

jquery.waypoints.min.js
infinite.min.js

Infinite 的元素选项指的是将用作航点并将获取的项目附加到的所有无限项目的容器。

.infinite-more-link与每个页面上的“下一页”元素匹配。

.infinite-item是一个选择器字符串,它应该与从每个页面中提取并附加到项目容器的各个项目相匹配。

偏移量与常规航点的偏移量选项相同,只是默认值现在是“视图底部”而不是 0。这意味着,默认情况下,当容器底部进入视图时,将加载新项目。

PageLoad 函数用于在帖子加载时显示微调器

任务完成!

无限滚动项目

你今天学到了一些非常有用的东西,并成功发射了你的无限滚动 Django 火箭!你可以从我的 git 仓库克隆或下载这个项目,别忘了在社交媒体上关注我,加入 Reverse Astronauts 社区!

保持联系!

# django

Django 是一个高级 Python Web 框架,旨在促进快速开发,并采用简洁实用的设计。它由经验丰富的开发人员构建,解决了 Web 开发中的许多难题,让您可以专注于编写应用,而无需重新设计轮子。它是免费且开源的。
文章来源:https://dev.to/thedevtimeline/infinite-scroll-with-django-d0a
PREV
女演员学习编程
NEXT
如何在 Django 中为模型添加标签 | Django 软件包系列 #1 django-taggit-tutorial