2008-09-21 33 views
8

假設我在Django中有一個博客應用程序。如何使用默認管理員中的可拖動表格重新排列帖子?使用拖放重新排序模型中的條目

這將是最好的,如果我不必添加任何額外的領域的模型,但如果我真的必須我可以。

+0

什麼是最好的解決方案現在,Django的1.2 2011/1.3? – monkut 2011-04-13 08:14:51

回答

1

在模型類中,您可能需要添加「訂單」字段以維護特定的訂單(例如,訂單= 10的商品是最後一個,訂單= 1是第一個)。然後您可以在admin change_list模板中添加一個JS代碼(請參閱this)以保持拖動&拖放功能。最後,將模型的Meta中的排序更改爲['order']之類的內容。

4

請注意「如果我不需要爲模型添加任何額外的字段,但如果我真的必須我可以,最好。」

對不起,數據庫中信息的順序是由信息本身決定的:您總是需要添加一個列來進行排序。這真的沒有選擇。

此外,要按照此順序檢索內容,您需要在您的查詢中專門添加.order_by(x)或將ordering添加到您的模型中。

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

沒有額外的字段排序不能發生。這是關係數據庫的規則之一。

+0

謝謝,與作者相反,我正在尋找添加的行! – 2015-12-08 10:44:47

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(代碼片段)因此,如果負責牽着你的屬性名稱和順序在您的模型中以不同的名稱命名。

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',)將根據在位置字段中的值訂購MainModel。當用戶拖放多個模型時, sortable_field_name = "position"將幫助自動填充位置值。

要在您的api中查看相同的順序,請在views_model.py中使用order_by(x)。 只是一個模型例如:

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