Как создать несколько атрибутов класса с для L oop? - PullRequest
0 голосов
/ 03 февраля 2020

Мне нужно создать 16 идентичных forms.Charfield в Django form. Итак, в основном мне нужно что-то вроде этого:

Class MyClass(forms.Form):
   a_1 = forms.CharField()
   ....
   a_16 = forms.CharField()

Есть ли способ создать их в for l oop, чтобы мне не приходилось печатать одно и то же 16 раз?

Я пытался:

Class MyClass(forms.Form):
    for i in range(1, 17):
        i = forms.CharField(
            label      = str(i),
            required   = False,
            max_length = 100,
        )   

, но это создает только одно поле, потому что, конечно, я не расширяюсь до 0, 1, 2 ... 16

Я также пытался использовать setattr вне класса и для хранения forms.CharField объектов в list, но они также не работали. На отображаемой странице поля не отображаются.

Class MyClass(forms.Form):
    b = forms.CharField()

for i in range(1, 17):
    setattr(
        MyClass, 
        'qt_'+str(i), 
        forms.CharField(
            label      = 'Other TMT labeling',
            required   = False,
            widget     = forms.Textarea(attrs={'rows':4,}),
        )
    )

Class MyClass(forms.Form):
    l = []
    for i in range(1, 17):
        l.append(forms.CharField(
            label      = str(i),
            required   = False,
            max_length = 100,
            )
        )

1 Ответ

2 голосов
/ 03 февраля 2020

Попробуйте так, переопределив метод __init__ класса формы:

Class MyClass(forms.Form):
    def __init__(self, *args, **kwargs):
       number_of_field_list = kwargs.pop('number_of_field_list')
       super().__init__(*args, **kwargs)

       for i in number_of_field_list:
          self.fields['q_{}'.format(i)] = forms.CharField(label=str(i), required=False, max_length=100)

# in view

def your_view(request):
   form = MyClass(number_of_field_list=[1,2,3,4,7])  # or use range(1,4)
   return render(request, 'template.html', {'form':form})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...