2008-09-21 15 views
8

Digamos que tengo una aplicación de blog en Django. ¿Cómo puedo reordenar las publicaciones usando una tabla arrastrable en el administrador predeterminado?Reordenar las entradas en un modelo usando arrastrar y soltar

Sería mejor si no tuviera que agregar ningún campo adicional al modelo, pero si realmente tengo que hacerlo.

+0

¿Cuál es la mejor solución ahora, para django 1.2/1.3 en 2011? – monkut

Respuesta

1

En la clase de modelo, probablemente tenga que agregar el campo "orden", para mantener el orden específico (por ejemplo, artículo con pedido = 10 es el último y el pedido = 1 es el primero). A continuación, puede agregar un código JS en la plantilla de administrador change_list (consulte this) para mantener la función de arrastrar &. Finalmente, cambie el orden en Meta del modelo a algo así como ['orden'].

4

Nota sobre "Sería mejor si no tuviera que agregar ningún campo adicional al modelo, pero si realmente tengo que hacerlo".

Lo sentimos, pero el orden de la información en una base de datos está determinado por la información misma: siempre debe agregar una columna para realizar un pedido. Realmente no hay otra opción sobre eso.

Además, para recuperar elementos en este orden, deberá agregar específicamente .order_by(x) a sus consultas o agregar ordering a su modelo.

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

Sin el campo adicional de pedidos no puede suceder. Es una de las reglas de las bases de datos relacionales.

+0

¡Gracias, contrario al autor, estaba buscando la línea para agregar! –

1

Usted puede tratar este fragmento https://gist.github.com/barseghyanartur/1ebf927512b18dc2e5be (originalmente basado en este fragmento http://djangosnippets.org/snippets/2160/).

La integración es muy simple.

Su modelo (en models.py):

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

    class Meta: 
     ordering = ('order',) 

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

Cambiar la JS (del fragmento) en consecuencia si sus atributos responsables de la celebración el nombre y el orden se nombran de manera diferente en su modelo.

0

El pedido solo puede determinarse si agrega un campo en su modelo. Agreguemos un campo de posición en su modelo.

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',) en Meta ordenará la MainModel de acuerdo con el valor en el campo de posición. sortable_field_name = "position" ayudará a completar automáticamente el valor en su posición cuando un usuario arrastre y suelte los múltiples modelos.

Para ver el mismo orden en su API, use order_by (x) en views_model.py. Solo un ejemplo de modelo:

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