Pergunta

Say Eu tenho um aplicativo blogs em Django. Como posso reordenar as mensagens usando uma tabela arrastável no admin padrão?

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

Foi útil?

Solução

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

Outras dicas

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 ordering ao 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.

Há um bom pacote para administração ordenação objetos estes dias

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

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

Na classe de modelo que você provavelmente teria de 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 de administração change_list (veja este ) para manter drag & recurso de queda. Finalmente mudar ordenação em Meta do modelo para algo como [ 'ordem'].

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 o 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.

A ordem só pode ser determinado se você adicionar um campo em seu 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 ordenará a MainModel de acordo com o valor no campo de 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, uso order_by (x) em views_model.py. Apenas um exemplo de modelo:

Model.objects.filter().order_by('position').
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top