2008-09-21 11 views
8

Angenommen, ich habe eine Blog-App in Django. Wie kann ich die Posts mit einer ziehbaren Tabelle im Standard-Admin neu anordnen?Neuordnen von Einträgen in einem Modell per Drag-and-Drop

Es wäre am besten, wenn ich dem Modell keine zusätzlichen Felder hinzufügen müsste, aber wenn ich es wirklich kann.

+0

Was ist die beste Lösung jetzt, für django 1.2/1.3 in 2011? – monkut

Antwort

1

In der Modellklasse müssten Sie wahrscheinlich das Feld "Reihenfolge" hinzufügen, um eine bestimmte Reihenfolge zu erhalten (zB Artikel mit der Reihenfolge = 10 ist der letzte und Auftrag = 1 ist der erste). Dann können Sie einen JS-Code in der Admin-Änderungsliste-Vorlage hinzufügen (siehe this), um die Drag-Funktion & zu behalten. Ändern Sie schließlich die Anordnung in Meta des Modells zu etwas wie ['order'].

4

Hinweis zu dem "Es wäre am besten, wenn ich dem Modell keine zusätzlichen Felder hinzufügen müsste, aber wenn ich es wirklich kann."

Sorry, aber Reihenfolge der Informationen in einer Datenbank wird durch die Informationen selbst bestimmt: Sie müssen immer eine Spalte für die Bestellung hinzufügen. Da gibt es wirklich keine Wahl.

Um weitere Informationen in dieser Reihenfolge abrufen zu können, müssen Sie .order_by(x) zu Ihren Abfragen hinzufügen oder ordering zu Ihrem Modell hinzufügen.

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

Ohne das zusätzliche Feld Bestellung kann nicht passieren. Es ist eine der Regeln relationaler Datenbanken.

+0

Danke, im Gegensatz zum Autor war ich auf der Suche nach der Zeile hinzuzufügen! –

1

Sie können diese Schnipsel versuchen https://gist.github.com/barseghyanartur/1ebf927512b18dc2e5be (ursprünglich auf der Grundlage dieser Schnipsel http://djangosnippets.org/snippets/2160/).

Die Integration ist sehr einfach.

Ihr Modell (in models.py):

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

    class Meta: 
     ordering = ('order',) 

Sie admin (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', 
     ) 

Ändern Sie die JS (des Snippets) entsprechend, wenn Ihre Attribute verantwortlich für das Halten Der Name und die Reihenfolge werden in Ihrem Modell anders benannt.

0

Die Reihenfolge kann nur bestimmt werden, wenn Sie ein Feld in Ihrem Modell hinzufügen. Fügen Sie ein Positionsfeld in Ihrem Modell hinzu.

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',) in Meta die MainModel entsprechend dem Wert im Positionsfeld bestellen. sortable_field_name = "position" hilft beim automatischen Ausfüllen des Werts in Position, wenn ein Benutzer die mehreren Modelle per Drag & Drop bewegt.

Um die gleiche Reihenfolge in Ihrer API anzuzeigen, verwenden Sie order_by (x) in views_model.py. Nur ein Modellbeispiel:

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