Добавить столько строк, сколько необходимо в определенное поле формы

Я использую crispy-forms для корректного отображения моих форм. Я хочу иметь поле, в котором пользователь может добавить столько строк ввода, сколько захочет. Допустим, это поле "увлечения", в котором сначала будет только 1 строка, затем пользователь может нажать кнопку "добавить строку", что позволит ему ввести второе увлечение на другой строке.

Я обнаружил, что это довольно похоже на часть по выбору в учебнике django (см. как это выглядит), где используется TabularInline :

class ChoiceInline(admin.TabularInline):
    model = Choice
    extra = 3

Однако, этот TabularInline работает только с моделями, а не с пользовательскими полями, как мне нужно, поэтому я не смог его использовать.

У меня было несколько идей, но я не смог найти способ их реализовать. Например, последнее, что я пробовал, это использовать MultiValueField только с одним полем с идеей добавить в него CharField при нажатии на кнопку, но я не нашел, как это сделать.

forms.MultiValueField(fields=(forms.CharField(),))

Поскольку мои поля создаются динамически с использованием переменных, вводимых пользователем, я не могу просто ссылаться на поля, как в случае с наборной формой. Если у кого-нибудь есть идеи, я буду рад, так как не вижу выхода.

Класс моей формы :

class ScriptInputForm(forms.Form):
    
    correspondances = { # Form field corresponding to different types of variables
        "str": forms.CharField(),
        "password": forms.CharField(widget=forms.PasswordInput),
        "int": forms.IntegerField(),
        "float": forms.FloatField(),
        "bool": forms.BooleanField(required=False),
        "datetime": forms.DateTimeField(
            widget=forms.DateTimeInput(
                attrs={
                    'step': 1, 
                    'onfocus': "(this.type='datetime-local')",
                    'onblur': "(this.type='text')",
                    }
                )
            ),
        "list": forms.MultiValueField(fields=(forms.CharField(),)), # What I struggle to do
    }

    def __init__(self, *args, **kwargs):
        variables = kwargs.pop('variables') # Dictionary containing variables like {'name': ['type','description'],...}
        variables_names = [*variables]
        super().__init__(*args, **kwargs)

        for var in variables_names:
            values = variables[var]
            self.fields[var] = self.correspondances.get(values[0], forms.CharField())
            self.fields[var].widget.attrs['placeholder'] = values[1]

        self.helper = FormHelper()
        self.helper.add_input(Submit('submit', 'Submit'))
        self.helper.form_action = reverse_lazy('scripts:data_input')
Вернуться на верх