JawsIk
@JawsIk
Python Django, Lua, ЧПУ-станки(ArtCam, Aspire)

Как в Django сделать механизм, при котором через объединённые формы можно изменять значений у нескольких записей сразу?

Суть в чём. Имеется модель настроек:
class Setting(models.Model):
    title = models.CharField(max_length=100, unique=True)
    slug = models.CharField(max_length=30, unique=True, blank=False)
    value = models.CharField(max_length=150, blank=False)
    
    def __str__(self):
        return self.title

Настроек там разных штук 50, и значения используются то там, то здесь в коде. Настройки разные. Авторизации почтовых ящиков (используемые для уведомлений), тоже самое про ключи для SMS, телеграмм-бота. Там же находятся банковские реквизиты, подписи для бланков и другие всякие штуки.
Конструкция взята из стороннего проекта, где под работу (CRUD) для этой модели использовались свои шаблоны с использованием REACT (а я пока в этом дуб дубом).
В общем я использовал только принцип "взять из базы и использовать по надобности", а если нужно было изменять, то напрямую в базе менял, ну в крайнем случае через админку Django.
Передал проект клиенту. Оно работает, и ... собственно я забыл и успокоился.
За это время сменилось там руководство, те, кто обслуживал сайты. И в голову ему "стукнула моча" сделать под изменение настроек специальный шаблон. При этом не классического варианта.

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


Так вот оно так не хочет. А хочет, чтобы сразу выдавался на странице список со всеми полями.

1. Название_настройки 1 | поле_для_ввода_slug1 | Поле_для_ввода_value1
2. Название_настройки 2 | поле_для_ввода_slug2 | Поле_для_ввода_value2
3. Название_настройки 3 | поле_для_ввода_slug3 | Поле_для_ввода_value3
...
57. Название_настройки 57 | поле_для_ввода_slug57 | Поле_для_ввода_value57

и в конце одна лишь кнопка "Сохранить".
Я давай спорить мол, ты же ёлки-маталки изменишь эти настройки один раз в жизни и забудешь. Но оно упёртое, доводов не понимает, а мозг выносит.

Собственно вопрос: Как такое реализовать? Можно ли это сделать без использования Ajax/Js в фоне (ибо для меня это боль). А именно, чтобы он на одной странице поменял хоть все значения в этих полях и нажав на кнопку "сохранить" всё там обновилось и поменялось.

Где про такое почитать? Как вообще такое сделать на Django?

С уважением.
  • Вопрос задан
  • 153 просмотра
Пригласить эксперта
Ответы на вопрос 2
tumbler
@tumbler Куратор тега Django
бекенд-разработчик на python
Ответ написан
Комментировать
Assargin
@Assargin
Перед ответом смотрю наличие ✔ в ваших вопросах
Если подходит вариант реализовать это в обычной админке Django, то решением может быть ModelAdmin.list_editable. Этот атрибут в джанге есть давно. И когда-то я его даже использовал.

Есть 1 подводный камень, по крайней мере года 3 назад он точно был: если в админке одной и той же модели изменяли данные более 1 человека, то данные могли непредсказуемо потеряться и/или измениться.

Поковыряв тогда исходники, я выяснил, что это происходит из-за того, что при сохранении отредактированных данных джанга опирается на относительное положение объекта (!) в кверисете (!!) в текущий момент!!!
Т.е., популярно выражаясь: не "сохрани значение Super Item в поле title инстанса id=345 модели MyModel", а "сохрани значение Super Item в поле title инстанса, который в текущем кверисете MyModel.objects.filter(category="Items") на странице №2 находится на 14-й позиции".

Причём сначала может показаться логичным, мол, классический кейс - одни и те же данные изменяют 2 и более человека, конечно можно получить перезаписывание, но если бы! Даже просто добавив новый объект этой модели, причём даже не из админки, можно запросто нарушить вот эту вот относительную "адресацию".
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы