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

如何在Django自定义CMS中实现可拖拽菜单并保存排序至数据库?

解决Django中拖拽排序区块的后端保存问题

要实现拖拽排序后的顺序保存到数据库,需要前端传递排序后的区块ID列表,后端接收后更新对应数据的排序字段,分以下几步操作:

1. 给HTML区块添加唯一标识

每个区块需要绑定数据库中对应的记录ID,方便后端识别:

<div class="col-sm-8 column draggable-blocks">
  <!-- 给每个block添加data-id,值为数据库中该区块的ID -->
  <div class="block" data-id="{{ block.id }}">
    <div class="block-title">
      <h2>Block #1</h2>
    </div>
    <p>...</p>
  </div>

  <div class="block" data-id="{{ block.id }}">
    <div class="block-title">
      <h2>Block #2</h2>
    </div>
    <p>...</p>
  </div>
</div>

2. 修改jQuery代码,发送排序数据到后端

在Sortable的配置中添加update事件,获取排序后的ID序列,通过AJAX发送到Django接口:

var UiDraggable = function() {
    return {
        init: function() {
            $('.draggable-blocks').sortable({
                connectWith: '.block',
                items: '.block',
                opacity: 0.75,
                handle: '.block-title',
                placeholder: 'draggable-placeholder',
                tolerance: 'pointer',
                start: function(e, ui){
                    ui.placeholder.css('height', ui.item.outerHeight());
                },
                // 排序完成后触发
                update: function(event, ui) {
                    // 获取排序后的所有区块ID
                    var blockIds = $(this).sortable('toArray', {attribute: 'data-id'});
                    // 发送AJAX请求
                    $.ajax({
                        url: '/save-block-order/', // 后端接口URL
                        type: 'POST',
                        data: {
                            'block_order': blockIds,
                            'csrfmiddlewaretoken': '{{ csrf_token }}' // Django CSRF令牌
                        },
                        success: function(response) {
                            console.log('排序保存成功');
                        },
                        error: function(xhr) {
                            console.error('排序保存失败');
                        }
                    });
                }
            });
        }
    };
}();

3. 准备Django模型(确保有排序字段)

你的Block模型需要添加一个用于存储排序顺序的字段,比如order:

from django.db import models

class Block(models.Model):
    title = models.CharField(max_length=255)
    content = models.TextField()
    order = models.IntegerField(default=0) # 排序字段

    class Meta:
        ordering = ['order'] # 默认按order字段排序

4. 编写Django视图处理排序保存

在views.py中编写视图函数,接收前端传来的排序数据,更新每个Block的order值:

from django.http import JsonResponse
from django.views.decorators.http import require_POST
from .models import Block

@require_POST
def save_block_order(request):
    block_order = request.POST.getlist('block_order[]') # 获取排序后的ID列表
    for index, block_id in enumerate(block_order):
        try:
            block = Block.objects.get(id=block_id)
            block.order = index
            block.save()
        except Block.DoesNotExist:
            continue
    return JsonResponse({'status': 'success'})

5. 配置URL路由

在urls.py中添加对应的路由:

from django.urls import path
from . import views

urlpatterns = [
    # 其他路由...
    path('save-block-order/', views.save_block_order, name='save_block_order'),
]

这样,当用户拖拽完成区块排序后,前端会自动把新的顺序发送到后端,后端更新数据库中的order字段,后续页面渲染时按order字段排序即可展示最新的区块顺序。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 14:35:22