使用拖放重新排序模型中的条目

时间:2008-09-21 11:05:29

标签: javascript python django

假设我在Django中有一个博客应用程序。如何使用默认管理员中的可拖动表重新排序帖子?

如果我不需要在模型中添加任何额外的字段,那将是最好的,但如果我真的必须这样做。

6 个答案:

答案 0 :(得分:6)

要使用代码执行此操作,请在snippet 1053处查看djangosnippets.org

答案 1 :(得分:4)

注意“如果我不需要在模型中添加任何额外的字段,那将是最好的,但如果我真的必须这样做。”

很抱歉,数据库中的信息顺序由信息本身决定:您总是需要添加一列进行订购。对此毫无选择。

此外,要按此顺序检索内容,您需要专门为查询添加.order_by(x)或将ordering添加到模型中。

class InOrder( models.Model ):
    position = models.IntegerField()
    data = models.TextField()
    class Meta:
        ordering = [ 'position' ]

没有额外的字段排序就不可能发生。这是关系数据库的规则之一。

答案 2 :(得分:3)

这些天有一个很好的用于订购管理对象的软件包

https://github.com/iambrandontaylor/django-admin-sortable

此外,django-suit内置了对此

的支持

答案 3 :(得分:1)

在模型类中,您可能需要添加“order”字段,以维持特定的顺序(例如,order = 10的项目是最后一项,order = 1是第一项)。然后,您可以在admin change_list模板中添加JS代码(请参阅this)以维护拖放功能。最后将模型Meta中的排序更改为['order']。

答案 4 :(得分:1)

您可以尝试使用此代码段https://gist.github.com/barseghyanartur/1ebf927512b18dc2e5be(最初基于此代码段http://djangosnippets.org/snippets/2160/)。

整合非常简单。

您的模型(在models.py中):

class MyModel(models.Model):
    name = models.CharField(max_length=255)
    order = models.IntegerField()
    # Other fields...

    class Meta:
        ordering = ('order',)

你管理员(admin.py):

class MyModelAdmin(admin.ModelAdmin):
    fields = ('name', 'order',) # Add other fields here
    list_display = ('name', 'order',)
    list_editable = ('order',)

    class Media:
        js = (
            '//code.jquery.com/jquery-1.4.2.js',
            '//code.jquery.com/ui/1.8.6/jquery-ui.js',
            'path/to/sortable_list.js',
        )

如果负责保存名称和排序的属性在模型中的命名方式不同,则相应地更改JS(代码段)。

答案 5 :(得分:0)

只有在模型中添加字段时才能确定订单。请在模型中添加位置字段。

In your models.py 

class MainModel(models.Model):

    name = models.CharField(max_length=255)
    position = models.PositiveSmallIntegerField(null=True)

    class Meta:
        ordering = ('position',)

In your apps admin.py

class IdeaCardTagInline(nested_admin.NestedStackedInline):
    model = MainModel
    extra = 0
    min_num = 1
    sortable_field_name = "position"
Meta中的

ordering = ('position',)将根据位置字段中的值对MainModel进行排序。 当用户拖放多个模型时,sortable_field_name = "position"将有助于自动填充位置值。

要在api中查看相同的顺序,请在views_model.py中使用order_by(x)。 只是一个模型示例:

Model.objects.filter().order_by('position').