@robick231

Как реализовать функционал создания форм в Django?

Мне нужно создавать формы в следующем порядке:

1. Создать название формы (generator)
2. Создать шаги заполнения формы
3. И к этим шагам добавить поля Чтобы потом использовать эти формы для заполнения на сайте.
Как можно реализовать этот функционал?

from django.db import models

from enum import Enum


class Generator(models.Model):
    name = models.CharField(max_length=255, verbose_name='Название')
    url = models.URLField(verbose_name='Сссылка для запросов')

    cost = models.DecimalField(max_digits=7, decimal_places=2, null=True)

    def __str__(self):
        return self.name


class Step(models.Model):
    generator = models.ForeignKey(Generator, on_delete=models.CASCADE, related_name='steps', verbose_name='Генератор')
    name = models.CharField(max_length=255, verbose_name='Название')

    def __str__(self):
        return f'{self.generator} - {self.name}'


class FieldChoices(Enum):
    text = 'text'
    email = 'email'
    tel = 'tel'
    url = 'url'
    password = 'password'
    number = 'number'
    search = 'search'
    date = 'date'
    time = 'time'
    range = 'range'
    radio = 'radio'
    checkbox = 'checkbox'
    color = 'color'
    file = 'file'
    hidden = 'hidden'


class Field(models.Model):
    step = models.ForeignKey(Step, on_delete=models.CASCADE, related_name='fields', verbose_name='Шаг')
    name = models.CharField(max_length=255, verbose_name='Название')
    type = models.CharField(max_length=255, choices=((choice.name, choice.value) for choice in FieldChoices))

    def __str__(self):
        return f'{self.step} - {self.name} {self.type}'
  • Вопрос задан
  • 62 просмотра
Решения вопроса 1
@robick231 Автор вопроса
Пришёл к следующему выходу:

Если вы про динамическое создание форм, то в python можно создавать классы при помощи метаклассов. Хорошо написано тут https://proglib.io/p/metaclasses-in-python/

Далее тут в конце https://www.b-list.org/weblog/2008/nov/09/dynamic-... есть пример как динамически создать форму

Таким образом можно динамически создавать формы
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Aman используйте PostgreSQL и JSONField, там можно хранить поля и всю необходимую инфу для генерации поля. Класс поля можно получить из строки ('CharField', 'IntegerField'... и т.д.) с помощью getattr и модуля django.db.models. field = field_class(**field_kwargs). Как-то так.
А для создания форм можно использовать formtools, очень полезная штука, туда можно и формы и формсеты ставлять.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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