Скажем, у меня есть приложение для ведения блога в Django. Как я могу изменить порядок сообщений с помощью перетаскиваемой таблицы в админке по умолчанию?
Было бы лучше, если бы мне не пришлось добавлять в модель какие-либо дополнительные поля, но если мне действительно нужно, я могу.
В классе модели вам, вероятно, придется добавить поле «порядок», чтобы поддерживать определенный порядок (например, элемент с порядком = 10 является последним, а порядок = 1 - первым). Затем вы можете добавить код JS в шаблон списка изменений администратора (см. это) для поддержки функции перетаскивания. Наконец, измените порядок в Meta модели на что-то вроде ['order'].
Обратите внимание на «Было бы лучше, если бы мне не пришлось добавлять в модель какие-либо дополнительные поля, но если мне действительно нужно, я могу».
Извините, но порядок информации в базе данных определяется самой информацией: вам всегда нужно добавлять столбец для заказа. У этого действительно нет выбора.
Кроме того, чтобы получить данные в этом порядке, вам нужно будет специально добавить .order_by(x)
к вашим запросам или добавить ordering
к вашей модели.
class InOrder( models.Model ):
position = models.IntegerField()
data = models.TextField()
class Meta:
ordering = [ 'position' ]
Без дополнительного упорядочивания полей не может быть. Это одно из правил реляционных баз данных.
Спасибо, вопреки автору искал строчку добавить!
Для рабочего кода для этого проверьте фрагмент 1053 в djangosnippets.org.
В наши дни есть хороший пакет для заказа административных объектов
https://github.com/iambrandontaylor/django-admin-sortable
Кроме того, костюм джанго имеет встроенную поддержку для этого
К сожалению, реализация django-suit не является перетаскиванием.
Вы можете попробовать этот фрагмент 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').
Какое сейчас лучшее решение для django 1.2 / 1.3 в 2011 году?