11

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

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

4

6 回答 6

6

有关执行此操作的工作代码,请查看djangosnippets.org上的代码片段 1053

于 2008-09-21T13:59:59.357 回答
4

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

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

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

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

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

于 2008-09-21T11:49:27.470 回答
3

这些天有一个很好的包来订购管理对象

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

此外,django-suit对此有内置支持

于 2013-05-02T08:13:16.737 回答
2

你可以试试这个片段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。

于 2014-07-28T12:47:06.713 回答
1

在模型类中,您可能必须添加“订单”字段,以维护特定订单(例如,订单 = 10 的项目是最后一个,订单 = 1 是第一个)。然后你可以在 admin change_list 模板中添加一个 JS 代码(见这个)来维护拖放功能。最后将模型 Meta 中的排序更改为 ['order'] 之类的东西。

于 2008-09-21T11:15:01.877 回答
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"

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

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

Model.objects.filter().order_by('position').
于 2017-06-08T06:56:34.527 回答