Изменение порядка записей в модели с помощью перетаскивания

Скажем, у меня есть приложение для ведения блога в Django. Как я могу изменить порядок сообщений с помощью перетаскиваемой таблицы в админке по умолчанию?

Было бы лучше, если бы мне не пришлось добавлять в модель какие-либо дополнительные поля, но если мне действительно нужно, я могу.

Какое сейчас лучшее решение для django 1.2 / 1.3 в 2011 году?

monkut 13.04.2011 12:14
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
9
1
4 890
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

В классе модели вам, вероятно, придется добавить поле «порядок», чтобы поддерживать определенный порядок (например, элемент с порядком = 10 является последним, а порядок = 1 - первым). Затем вы можете добавить код JS в шаблон списка изменений администратора (см. это) для поддержки функции перетаскивания. Наконец, измените порядок в Meta модели на что-то вроде ['order'].

Обратите внимание на «Было бы лучше, если бы мне не пришлось добавлять в модель какие-либо дополнительные поля, но если мне действительно нужно, я могу».

Извините, но порядок информации в базе данных определяется самой информацией: вам всегда нужно добавлять столбец для заказа. У этого действительно нет выбора.

Кроме того, чтобы получить данные в этом порядке, вам нужно будет специально добавить .order_by(x) к вашим запросам или добавить ordering к вашей модели.

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

Без дополнительного упорядочивания полей не может быть. Это одно из правил реляционных баз данных.

Спасибо, вопреки автору искал строчку добавить!

Jay Cee 08.12.2015 13:44
Ответ принят как подходящий

Для рабочего кода для этого проверьте фрагмент 1053 в djangosnippets.org.

В наши дни есть хороший пакет для заказа административных объектов

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

Кроме того, костюм джанго имеет встроенную поддержку для этого

К сожалению, реализация django-suit не является перетаскиванием.

Nexus 11.10.2016 00:56

Вы можете попробовать этот фрагмент https://gist.github.com/barseghyanartur/1ebf927512b18dc2e5be (изначально основанный на этом фрагменте http://djangosnippets.org/snippets/2160/).

Интеграция очень проста.

Ваша модель (в models.py):

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

    class Meta:
        ordering = ('order',)

Вы админ (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',
        )

Измените JS (фрагмента) соответствующим образом, если ваши атрибуты, отвечающие за хранение имени и порядка, в вашей модели названы по-другому.

Порядок можно определить только в том случае, если вы добавите поле в свою модель. Давайте добавим поле позиции в вашу модель.

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',) в Meta упорядочит MainModel в соответствии со значением в поле позиции. sortable_field_name = "position" поможет в автозаполнении значения в позиции, когда пользователь перетаскивает несколько моделей.

Чтобы увидеть тот же порядок в вашем API, используйте order_by (x) в views_model.py. Просто модельный пример:

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

Другие вопросы по теме