题
假设我在Django中有一个博客应用程序。如何使用默认管理员中的可拖动表重新排序帖子?
如果我不需要在模型中添加任何额外的字段,那将是最好的,但如果我真的必须这样做。
解决方案
要使用代码执行此操作,请在代码段1053 http://www.djangosnippets.org“rel =”noreferrer“> djangosnippets.org 。
其他提示
请注意“如果我不需要在模型中添加任何额外的字段,那将是最好的,但如果我真的需要我可以。”
很抱歉,数据库中的信息顺序由信息本身决定:您总是需要添加一列进行订购。对此毫无选择。
此外,要按此顺序检索内容,您需要专门将 .order_by(x)
添加到您的查询中,或者将 ordering
添加到您的模型中。
class InOrder( models.Model ):
position = models.IntegerField()
data = models.TextField()
class Meta:
ordering = [ 'position' ]
没有额外的字段排序就不可能发生。这是关系数据库的规则之一。
这些天有一个很好的用于订购管理对象的软件包
https://github.com/iambrandontaylor/django-admin-sortable
此外, django-suit 已内置对此的支持
在模型类中,您可能需要添加“order”。字段,以维持特定的顺序(例如,订单= 10的项目是最后一个,订单= 1是第一个)。然后你可以在admin change_list模板中添加一个JS代码(参见这个)以保持拖放功能。最后将模型Meta中的排序更改为['order']。
您可以尝试使用此代码段 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(代码段)。
只有在模型中添加字段时才能确定订单。让我们在模型中添加一个位置字段。
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').