My Issue
Я пишу Django приложение, в котором я хочу, чтобы пользователи вводили адреса через форму. Я хочу, чтобы пользователи могли добавлять дополнительные поля адресов, если они хотят ввести больше адресов по умолчанию (3). Я изо всех сил пытался выяснить, как это сделать.
Первая попытка
Первый способ, которым я попытался, - просто использовать JavaScript для добавления полей одним нажатием кнопки, но при этом данные из добавленного поля не передаются. Я получаю данные из трех полей, жестко запрограммированных в классе формы, но дополнительные поля не отправляются, я полагаю, потому что они не являются частью созданного мною класса формы.
Текущая попытка
Поскольку я не мог использовать данные из полей, добавленных с помощью JavaScript, сейчас я пытаюсь создать динамически изменяемый размер в Python. Мое общее мнение состоит в том, чтобы передать число полей местоположения классу, а затем использовать это число для создания формы. Я знаю, что мой циклический механизм для создания самой формы работает, потому что я протестировал ее с жестко закодированными числами. Однако я сделал это без переопределения функции __init__
. Чтобы передать число в форму, мне нужно переопределить эту функцию. Когда я делаю это, кажется, что объект формы не создается, и я понятия не имею, почему. Вот пример моего кода:
forms.py
from django import forms
from crispy_forms.helper import FormHelper
from crispy_forms.layout import Submit, Layout, Row, Column, ButtonHolder, Button
class EnterLocationsForm(forms.Form):
def __init__(self, *args, **kwargs):
num_locations = kwargs.pop('num_locations')
super().__init__(*args, **kwargs)
for i in range(1, num_locations + 1):
name = 'location{}'.format(i)
exec("{} = {}".format(
name,
"forms.CharField(widget=forms.TextInput(
attrs={'placeholder': 'Address {}'.format(i)}))")
)
helper = FormHelper()
helper.form_class = 'form-horizontal'
helper.form_method = 'POST'
helper.form_show_labels = False
helper.layout = Layout()
for i in range(1, num_locations + 1):
helper.layout.append(Row(
Column('location{}'.format(i), css_class='form-group'),
css_class='form-row'
),)
helper.layout.append(ButtonHolder(
Button('submit', 'Go', css_class='btn btn-primary'),
Button('add', '+', css_class="btn btn-success"),
css_id="button-row",
))
views.py
from .forms import EnterLocationsForm
location_count = 3
def index(request):
if request.method == 'POST':
form = EnterLocationsForm(request.POST, num_locations=location_count)
...
else:
form = EnterLocationsForm(num_locations=location_count)
# if I write print(form) here, nothing is printed
return render(request, 'index.html', {'form': form})
Любые советы о том, почему это не создает объект формы будет высоко ценится! Если бы был способ заставить мой первый подход работать, это было бы замечательно.