Для того чтобы сохранить порядок добавления значений в поле `filter_horizontal` в Django-admin, вы можете воспользоваться следующим подходом:
1. **Добавление поля для хранения порядка**: Вам нужно создать дополнительное поле в модели, которое будет хранить порядок выбранных элементов. Например, вы можете использовать `PositiveIntegerField`, чтобы хранить индекс каждого размера.
2. **Изменение формы админ-панели**: Переопределите форму админ-панели, чтобы использовать это поле при сохранении порядка.
3. **Перенаправление на порядок**: В методе `save` формы вам нужно сохранить порядок элементов при сохранении модели.
Пример реализации подхода:
```python
from django.db import models
from django.contrib import admin
from django import forms
class Size(models.Model):
name = models.CharField(max_length=100)
class Product(models.Model):
sizes = models.ManyToManyField(Size, through='ProductSize')
class ProductSize(models.Model):
product = models.ForeignKey(Product, on_delete=models.CASCADE)
size = models.ForeignKey(Size, on_delete=models.CASCADE)
order = models.PositiveIntegerField(default=0)
class Meta:
ordering = ['order']
class ProductSizeInline(admin.TabularInline):
model = ProductSize
extra = 1
class ProductAdmin(admin.ModelAdmin):
inlines = [ProductSizeInline]
admin.site.register(Size)
admin.site.register(Product, ProductAdmin)
```
Теперь, когда вы добавляете размеры в продукт через админ-панель, порядок сохраняется в поле `order` в модели `ProductSize`. Обратите внимание, что `ordering` в `Meta` класса `ProductSize` гарантирует, что размеры будут отсортированы по порядку.
Если вы хотите позволить пользователям настраивать порядок размеров с помощью перетаскивания в админке, вы можете использовать JavaScript и сторонние библиотеки (например, jQuery UI Sortable или подобные), чтобы сделать интерфейс более удобным и интуитивным.
Также вы можете использовать Django Packages, такие как `django-admin-sortable2`, чтобы добавить выбранный функционал без необходимости писать код для перетаскивания самостоятельно.