Django Класс Crispy Form не создает объект - PullRequest
0 голосов
/ 16 января 2020

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})

Любые советы о том, почему это не создает объект формы будет высоко ценится! Если бы был способ заставить мой первый подход работать, это было бы замечательно.

...