Как сформировать список request.POST в Django

У меня есть следующий код в файле views.py:

def valores(request):
    global peso_unitario, preco_unitario
    peso_unitario=[]
    preco_unitario=[]

    N=a
    print('N='+str(N))

    for i in range(N):
        peso_u = request.POST['peso_u']
        preco_u = request.POST['preco_u']

        if peso_u.isdigit() and preco_u.isdigit():
            c = int(peso_u)
            d = int(preco_u)
            peso_unitario.append(c)
            preco_unitario.append(d)
            print(a)
            if i==N-1:
                return render(request, 'pacote.html', {'peso_unitario': peso_unitario, 'preco_unitario': preco_unitario})
        else:
            res = 'Apenas numero.'
            return render(request, 'pacote.html', {'res': res})

На предыдущем шаге мы заполнили текстовое поле числом N. Теперь я хочу сгенерировать N текстовых полей для заполнения пользователем, но не знаю, как это сделать.

Для динамического создания форм formset следует использовать N. Вы можете обратиться к документации, чтобы увидеть, как реализовать один из них.

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

В любом случае, получив это N, вы можете построить форму с N похожими формами динамически. (Как упоминалось другими, другой способ - использовать набор форм).

class Baseform( forms.Form):
   ...
   # everything apart from the variable  fields

fields = {}
for n in range(N):
     fields[ f'form_{n}'] = forms.Charfield( # or whatever
         label = f'form{n}', ... # other form args
     )

My_Dynamic_Form = type(
    'My_Dynamic_Form',  (BaseForm, ), fields
)

Ввести, проверить как обычно, обработать поля переменных:

form = My_Dynamic_Form( ...)
if form.is_valid():
    # your variable data will be in form.cleaned_data['form_0'] upwards.
    # maybe
    for n in range(1000):
        key = f'form_{n}'
        if not (key in form.cleaned_data):
            break
        val = form.cleaned_data.get(key)
        # do whatever with val 

Вы можете итерировать все размещенные данные, используя request.POST.items() пример:

for key, value in request.POST.items():
    print(f"{key}: {value}")

Выход:

имя: момо
фамилия: тити

Вернуться на верх