Ré-commander des entrées dans un modèle en utilisant le glisser-déposer

Dis-moi que j'ai une application blogging dans Django. Comment puis-je ré-ordonner les messages à l'aide d'une table draggable dans l'administrateur par défaut?

Il serait préférable que je ne devais pas ajouter de champs supplémentaires au modèle, mais si je peux vraiment le faire.

Pour le code de fonctionnement pour ce faire, consultez l' extrait 1053 à djangosnippets.org .

Note sur "Ce serait mieux si je n'avais pas à ajouter de champs supplémentaires au modèle, mais si je dois vraiment le faire".

Désolé, mais l'ordre des informations dans une base de données est déterminé par l'information elle-même: vous devez toujours ajouter une colonne pour la commande. Il n'y a vraiment aucun choix à ce sujet.

De plus, pour récupérer les choses dans cet ordre, vous devrez ajouter spécifiquement .order_by(x) à vos requêtes ou ajouter des ordering à votre modèle.

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

Sans la commande de champ supplémentaire ne peut pas se produire. C'est l'une des règles des bases de données relationnelles.

Il y a un bon paquet pour commander des objets administratifs ces jours-ci

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

Aussi, django-suit a un soutien intégral pour cela

Dans la classe de modèle, vous devrez probablement ajouter un champ "commande" pour maintenir un ordre spécifique (par exemple, l'élément avec ordre = 10 est le dernier et l'ordre = 1 est le premier). Ensuite, vous pouvez ajouter un code JS dans le modèle admin change_list (voir ceci ) pour maintenir la fonctionnalité de glisser-déposer. Enfin, modifiez la commande dans Meta of model à quelque chose comme ['order'].

Vous pouvez essayer cet extrait https://gist.github.com/barseghyanartur/1ebf927512b18dc2e5be (basé à l'origine sur cet extrait http://djangosnippets.org/snippets/2160/ ).

L'intégration est très simple.

Votre modèle (dans models.py):

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

Vous 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', ) 

Modifiez le JS (de l'extrait) en conséquence si vos attributs responsables de la saisie du nom et de la commande sont nommés différemment dans votre modèle.

L'ordre ne peut être déterminé que si vous ajoutez un champ dans votre modèle. Ajoutez un champ de position dans votre modèle.

 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',) dans Meta ordonnera le MainModel en fonction de la valeur dans le champ de position. sortable_field_name = "position" aidera à remplacer automatiquement la valeur en position lorsqu'un utilisateur arrache et dépose les multiples modèles.

Pour voir le même ordre dans votre api, utilisez order_by (x) dans views_model.py. Juste un exemple de modèle:

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