@nurzhannogerbek

Как осуществить сортировку списка перетаскиванием в Джанго?

Здравствуйте! Помогите пожалуйста разобраться.

В своем Джанго проекте я на страницу вывожу список книг. У модели данных Book есть поле position, по которой ведется сортировка. Необходимо дать возможность пользователю отсортировать список с помощью перетаскивания. Вопрос в следующем. Кто-нибудь сталкивался с подобной задачей?

Я нашел в JQuery UI раздел sortable, но не совсем понимаю как это связать с Джанго, чтобы при перетаскивании менялось значение поля position и сохранялось в БД. Помогите пожалуйста разобраться и направить на верный путь. На данный момент все работает только на frontend-e.

models.py:
class Book(models.Model):
    title = models.CharField(max_length=200, help_text='Заголовок', blank=False)
    position = models.IntegerField(help_text='Поле для сортировки', default=0, blank=True)
    
    class Meta:
        ordering = ['position', 'pk']


html:
<div id="books" class="list-group">
{% for book in books %}
	<div class="panel panel-default list-group-item ui-state-default">
		<div class="panel-body">{{ book.title }}</div>
	</div>
{% endfor %}
</div>


JS:
$( "#books" ).sortable();
  • Вопрос задан
  • 1047 просмотров
Пригласить эксперта
Ответы на вопрос 2
@id2669099
по-моему не очень хорошая идея сохранять данные сортировки книг в БД. Ведь один пользователь может отсортировать так, а другой иначе и судя по Вашей модели, для любого пользователя будет выводиться последняя сортировка, такие вещи надо сохранять у самого пользователя, в cookie, например
Ответ написан
@kulaeff
Front-end developer
У плагина sortable есть событие update, которое вызывается каждый раз, когда юзер перетащил элемент на новое место. Подробнее тут api.jqueryui.com/sortable/#event-update. Таким образом, делается как-то так:

$( "#books" ).sortable({
  update: function( event, ui ) {
    // В ui содержится вся необходимая инфа о новой позиции перемещенного элемента
    // которую вы можете сохранить в БД аякс-запросом
  }
});
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы