Как сохранить порядок добавления значений в список «Выбранные значения» в filter_horizontal?

Как можно сохранить порядок добавления значений в список "Выбранные значения" в filter_horizontal для поля 'sizes' в админ-панели, чтобы он совпадал с тем порядком, в котором я их выбираю?
  • 16 ноября 2024 г. 22:53
Ответы на вопрос 2
Для того чтобы сохранить порядок добавления значений в поле `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`, чтобы добавить выбранный функционал без необходимости писать код для перетаскивания самостоятельно.
SQL ничего не знает про порядок, поэтому что бы его сохранять, нужно иметь какое-то поле по которому ты потому будет сортировать
Похожие вопросы