Re-ordenação entradas em um modelo usando drag-and-drop

votos
8

Digamos que eu tenha um aplicativo de blogging em Django. Como posso reordenar as mensagens usando uma tabela arrastável no padrão do administrador?

Seria melhor se eu não tivesse que adicionar os campos extras para o modelo, mas se eu realmente tenho que eu posso.

Publicado 21/09/2008 em 12:05
fonte usuário
Em outras línguas...                            


6 respostas

votos
6

Para código para fazer isso funcionar, veja trecho de 1.053 em djangosnippets.org .

Respondeu 21/09/2008 em 14:59
fonte usuário

votos
4

Nota sobre o "Seria melhor se eu não tivesse que adicionar os campos extras para o modelo, mas se eu realmente tenho que eu posso."

Desculpe, mas a ordem de informações em um banco de dados é determinada pela informação em si: você sempre tem que adicionar uma coluna para a ordenação. Não há realmente nenhuma escolha sobre isso.

Além disso, para recuperar as coisas nesta ordem, você vai precisar adicionar especificamente .order_by(x)às suas perguntas ou adicionar orderingao seu modelo.

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

Sem a ordenação campo adicional não pode acontecer. É uma das regras de bancos de dados relacionais.

Respondeu 21/09/2008 em 12:49
fonte usuário

votos
3

Há um bom pacote para encomendar administrador objetos nos dias de hoje

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

Além disso, django-suit tem suporte nativo para este

Respondeu 02/05/2013 em 09:13
fonte usuário

votos
1

Você pode tentar esse trecho https://gist.github.com/barseghyanartur/1ebf927512b18dc2e5be (originalmente com base neste trecho http://djangosnippets.org/snippets/2160/ ).

A integração é muito simples.

Seu modelo (em models.py):

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

    class Meta:
        ordering = ('order',)

Você 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',
        )

Alterar as JS (do snippet) de acordo, se os seus atributos responsáveis ​​pela realização da nome e ordenação são nomeados de forma diferente em seu modelo.

Respondeu 28/07/2014 em 13:47
fonte usuário

votos
1

Na classe de modelo você provavelmente teria que adicionar campo "ordem", para manter a ordem específica (por exemplo. O artigo com order = 10 é o último e ordem = 1 é o primeiro). Então você pode adicionar um código JS no modelo change_list admin (ver este ) para manter drag & recurso cair. Finalmente mudar encomendar na Meta de modelo para algo como [ 'ordem'].

Respondeu 21/09/2008 em 12:15
fonte usuário

votos
0

A ordem só pode ser determinado se você adicionar um campo em seus model.Let de adicionar um campo de posição no seu 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',)em Meta irá pedir o MainModel de acordo com o valor no campo posição. sortable_field_name = "position"vai ajudar no preenchimento automático do valor na posição quando um usuário arraste e solte os vários modelos.

Para ver a mesma ordem em sua API, use order_by (x) em views_model.py. Apenas um exemplo do modelo:

Model.objects.filter().order_by('position').
Respondeu 08/06/2017 em 06:56
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more