Nachbestellung Einträge in einem Modell mit Drag-and-Drop
-
02-07-2019 - |
Frage
Sagen, dass ich eine Blogging-app in Django haben. Wie kann ich wieder um eine ziehbar Tabelle in der Standard-Admin die Beiträge mit?
Am besten wäre es, wenn ich keine zusätzlichen Felder zum Modell hinzugefügt habe, aber wenn ich wirklich haben, ich kann.
Lösung
Code arbeiten, dies zu tun Besuche Snippet 1053 unter djangosnippets.org .
Andere Tipps
Hinweis auf die „Am besten wäre es, wenn ich keine zusätzliche Felder zum Modell hinzugefügt haben, aber wenn ich muss, ich kann wirklich.“
Es tut uns Leid, 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. Es gibt wirklich keine Wahl darüber.
Ferner abzurufen Dinge in dieser Reihenfolge, müssen Sie speziell .order_by(x)
auf Ihre Fragen hinzufügen oder ordering
zu Ihrem Modell hinzufügen.
class InOrder( models.Model ):
position = models.IntegerField()
data = models.TextField()
class Meta:
ordering = [ 'position' ]
Ohne die zusätzliche Feld Bestellung kann nicht passieren. Es ist eine der Regeln von relationalen Datenbanken.
Es gibt ein schönes Paket Admin für die Bestellung in diesen Tagen Objekte
https://github.com/iambrandontaylor/django-admin-sortable
Auch django-Anzug hat eingebaute Unterstützung für diese
In Modellklasse würden Sie wahrscheinlich „Ordnung“ Feld muss hinzufügen, bestimmten Reihenfolge zu halten (z. B. Artikel mit order = 10 ist die letzte und Ordnung = 1 ist die erste). Dann können Sie einen JS-Code in Admin change_list Vorlage (siehe
Sie können versuchen, diese Schnipsel 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): Sie admin (admin.py): Sie die JS ändern (des Snippets) entsprechend, wenn Ihre Attribute für den Namen und die Reihenfolge hält anders in Ihrem Modell genannt werden. class MyModel(models.Model):
name = models.CharField(max_length=255)
order = models.IntegerField()
# Other fields...
class Meta:
ordering = ('order',)
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',
)
Die Bestellung kann nur bestimmt werden, wenn Sie ein Feld in Ihrer model.Let der fügen Sie ein Positionsfeld in Ihrem Modell hinzufügen.
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 bestellen entsprechend den Wert im Positionsfeld.
sortable_field_name = "position"
wird in autofill des Wertes in Position helfen, wenn ein Benutzer per Drag & Drop die mehrere Modelle.
Um die gleiche Reihenfolge in Ihrem api zu sehen, verwenden order_by (x) in views_model.py. Nur ein Modellbeispiel:
Model.objects.filter().order_by('position').