Django реализация сложного сценария с динамическими формами

289
13 мая 2021, 19:30

В процессе разработки своего тренировочного проекта появилась потребность реализовать следующий сценарий для ввода параметром n количества деталей в БД.
Страница должна представлять собой произвольный набор форм для ввода информации по каждой детали.
Форма для каждого изделия представляет собой набор статических полей (серийный номер, дата, тип и тд) и набор динамического набора полей характеристик, зависящего от типа изделия.

Примерная визуализация задумки:

Более опытных коллег прошу помочь навести на путь истинный в следующих вопросах:
1) Как динамически менять формсет представляющий собой форму для каждой детали в зависимости от выбора в поле type.
2) Как сделать формсет, формсетов, для добавления произвольного количества "строк" в форму.

Кусочек models.py для сценария:

class Product_2_characteristic(models.Model):
    product_id = models.ForeignKey('Product',on_delete=models.DO_NOTHING)
    characteristic_of_product_id = models.ForeignKey('Characteristic_of_product', on_delete=models.DO_NOTHING)
    operation_history_id = models.ForeignKey('Operation_history', on_delete=models.DO_NOTHING)
    value = models.CharField(max_length=255)
    def get_absolute_url(self):
        # Беру по полю оперейшин_хистори для удобства
        return reverse('product_2_characteristic-detail', args=[str(self.operation_history_id_id)])

class Product(models.Model):
    serial_number = models.CharField(max_length=255)
    type_of_product_id = models.ForeignKey('Type_of_product', on_delete=models.DO_NOTHING)
    Assembly = models.ManyToManyField('Product')
    def get_absolute_url(self):
        return reverse('product-detail', args=[str(self.id)])

class Operation_history(models.Model):
    start_date = models.DateTimeField(auto_now_add=True)
    end_date = models.DateTimeField(auto_now_add=True)
    type_of_operation_id = models.ForeignKey('Type_of_operation', on_delete=models.DO_NOTHING)
    type_of_defect_id = models.ForeignKey('Type_of_defect', on_delete=models.DO_NOTHING)
    employess_id = models.ForeignKey('Employess', on_delete=models.DO_NOTHING)

class Type_of_operation(models.Model):
    label = models.CharField(max_length=255)

class Type_of_defect(models.Model):
    label = models.CharField(max_length=255)

К сожалению, задача поставила меня в тупик и внятных вариантов в части views и forms я предоставить не могу.

Answer 1

Крайне сочувствую вам, что вы наткнулись на туже задачу, что я пару месяцев назад.

Решения из коробки - нет.

Для формсетов с формсетами можете попробовать это либо это (может одно и тоже, смотрел про примерным признакам, знакомому коду), либо пишите сами, указывая префиксы вложенных формсетов вмсесте с префиксами рожительских. Много JS кода будет для динамического добавления.

Что касается разных наборов полей, могу посоветовать либо подгружать их через AJAX и вставлять в HTML, запрашивая нужный тип формы (будет много форм), либо делать как ModelForm и собирать форму динамически. Поля и их тип можно хранить в БД в JSON (в принципе можно все так хранить, но полагаю вам нужно потом работать с этими объектами, так что для каждой модели своя таблица, а формы для них в JSON в отдельной таблице)

Вот кстати хороший, но древний вариант для динамической формы (https://habr.com/ru/post/46845/)

В принципе, вашу задачу можно решить, написав много JS и AJAX, постоянно подменивая формы и отправляя их по AJAX на свой URL для сохранения

READ ALSO
Как интегрировать статистику аккаунта Stack Overflow в свой сайт?

Как интегрировать статистику аккаунта Stack Overflow в свой сайт?

У меня есть среда для разработки сайтов

104
Как посчитать количество знаков ДО запятой?

Как посчитать количество знаков ДО запятой?

Не нашел ни одного удобного решенияЯ представляю, что нужно делить на 10, 100, 1000, … , но надеюсь, что есть уже стандартная функция, которая позволит...

119
Как работает перебор свойств объекта?

Как работает перебор свойств объекта?

Не могу понять как работает этот код? Мы в цикле for создаём переменную cur и в условии проверяем ее наличие в объекте oНо ее там нет, условие должно...

91
JS не рисуется изображение на canvas

JS не рисуется изображение на canvas

Суть проблемы в том, что не рисуется ничего в canvasВ атрибут функции image1 передаю src и в консоли получаю "вход: (тут base64 изображения входного)",...

121