You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Django分页+无限滚动时HTMX点击功能失效求助

Django无限滚动下HTMX加入购物车按钮失效问题排查

我在Django应用中实现了点击商品卡片加入购物车的功能,采用infinite-scroll(无限滚动)和django-pagination(Django分页)组件。目前遇到的问题是:第一页的HTMX功能完全正常,但第二页及之后的页面,点击加入购物车按钮无任何响应。检查页面后发现HTML渲染正常,hx-get请求的URL也正确,但点击操作没有触发预期行为。

相关代码

HTML主页面代码

<div class="container"
    data-infinite-scroll='{ "path": ".pagination__next", "append": ".product-card", "history":"false"}'>
    {% block content %}
    {% include 'includes/cards.html' %}
    {% include 'includes/sidebar.html' %}
    {% endblock content %}
</div>
<ul class="pagination mt-50 mb-70">
    {% if products.has_previous %}
         <li class="page-item"><a class="page-link" href="?page={{ products.previous_page_number }}"><i class="fa fa-angle-left"></i></a></li>
     {% endif %}
     <li class="page-item"><a class="page-link" href="#">{{ products.number }}</a></li>
      {% if products.has_next %}
     <li class="page-item"><a class="pagination__next" href="?page={{ products.next_page_number }}"><i class="fa fa-angle-right"></i></a></li>
     {% endif %}
</ul>

views.py代码

def shop(request):
    anabanner = AnaBanner.objects.all()
    gender = Gender.objects.all()
    categories = Category.objects.all()
    colors = Color.objects.all()
    materials = Material.objects.all()
    query = request.GET.get('query','')
    products = Product.objects.all().order_by('-pk')
    if query:
        products = products.filter(
            Q(name__icontains=query)|
            Q(sub_name__icontains=query)
        ).distinct()
    paginator = Paginator(products, 8)

    page = request.GET.get('page')

    products = paginator.get_page(page)
    context = {'products':products,'categories':categories,'gender':gender,'anabanner':anabanner,'colors':colors,'materials':materials}
    return render(request, 'shop.html', context)

加入购物车按钮代码(cards.html中)

<div class="button">
    <div class="button-layer"></div>
    <button name="ekle" 
        href ="#"
        hx-get="{% url 'add_to_cart' product.id %}"
        hx-target="#menu-cart-button"
        hx-swap="outerHTML" 
        class="btn btn-outline-secondary add-btn update-cart">Sepete Ekle</button>
</div>

问题原因

HTMX依赖事件委托处理初始DOM元素的交互,但无限滚动动态加载的新内容(第二页及以后的商品卡片)不会被HTMX自动绑定事件监听,导致点击按钮无响应。

解决方案

方案1:手动触发HTMX扫描新DOM元素

利用infinite-scroll的加载完成回调,调用HTMX全局方法处理新添加的元素:

document.querySelector('.container').addEventListener('append.infiniteScroll', function(event) {
  htmx.process(event.target);
});

方案2:调整视图返回内容适配HTMX

通过django-htmx判断请求类型,分页请求仅返回商品卡片片段,让HTMX自动处理新元素:

  1. 安装并配置django-htmx后,修改视图:
def shop(request):
    # 原有逻辑不变
    if request.htmx:
        return render(request, 'includes/cards.html', context)
    return render(request, 'shop.html', context)

方案3:改用HTMX原生实现无限滚动

替换独立的infinite-scroll组件,直接用HTMX属性实现滚动加载,自动处理新元素事件:

{% if products.has_next %}
<li class="page-item">
    <a class="pagination__next" 
       hx-get="?page={{ products.next_page_number }}"
       hx-target=".container"
       hx-swap="beforeend">
        <i class="fa fa-angle-right"></i>
    </a>
</li>
{% endif %}

同时移除原容器上的data-infinite-scroll属性。

内容的提问来源于stack exchange,提问作者Berkant Dirim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 13:24:26