Добавить столько строк, сколько необходимо в определенное поле формы
Я использую 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')