Crispy forms field_class применяется неправильно

У меня есть Django форма, в которой я использую crispy-forms вместе с bootstrap5. Все было хорошо, пока я не захотел изменить макет формы. Поскольку моя форма строится динамически, я просто хотел определить значение элемента набора item, который находится под формой (field_name, layout_index). Целью было определить его как FieldWithButton, поскольку я не смог найти другого способа сделать это.

Для этого я модифицировал свой помощник в методе __init__ моей формы :

self.helper[item[1]] = Div(FieldWithButtons(item[0], StrictButton("Add item")), id=f'div_id_{item[0]}', css_class='mb-3 row')

Это отображается почти правильно в моей форме, у меня есть FieldWithButton с Div и т.д. Однако div, содержащий FieldWithButton, не принимает field_class моего помощника, который я определил, и вместо этого создает <divclass='col-10'>...</divclass='col-10'>.

Там просто пробел, который исчез и все испортил. Как я могу либо удалить часть class='col-10' из моего div и поместить его как его класс, либо по-другому определить мое поле как FieldWithButton ?

Вот весь мой класс форм, если нужно :

class ScriptInputForm(forms.Form):

    def __init__(self, *args, **kwargs):
        variables = kwargs.pop('variables') # All variables to render 
        variables_names = [*variables]      # under the form {'name':['type', 'description']}

        super().__init__(*args, **kwargs)

        for var in variables_names: # Dynamic creation of the fields
            values = variables[var]
            field = self.fields[var] = forms.CharField()
            field.widget.attrs['placeholder'] = values[1].title()

        self.helper = FormHelper(self)

        num = 1 # Rough part where I define the tuples ('name', 'index') of all lists in my variables
        lists = []
        for k,v in variables.items():
            if v[0]=='list':
                lists.append((k,num))
            num+=1

        for item in lists: # Part where the problem is coming from
            self.helper[item[1]] = Div(FieldWithButtons(item[0], StrictButton("Add item"))) 

        self.helper.add_input(Submit('submit', 'Submit'),)
        self.helper.label_class = 'col-2'
        self.helper.field_class = 'col-10'

        self.helper.form_action = reverse_lazy('scripts:data_input')

И отрендеренный HTML :

<div> 
    <div class="mb-3 row"> 
        <label for="id_liste" class="col-form-label col-2">Liste</label>
        <divclass="col-10"> <!-- With <div class="col-10"> everything's ok -->
            <div class="input-group"> 
                <input type="text" name="liste" placeholder="Your List" class="textinput textInput form-control" id="id_liste"> 
                    <button class="btn" type="button">Add item</button> 
            </div> 
        </divclass="col-10">
    </div>
</div>

Похоже, что это ошибка в crispy-bootstrap5. Дисплей FieldWithButtons определяется в field_with_buttons.html, код которого следующий :

<div{% if div.css_id %} id="{{ div.css_id }}"{% endif %} class="mb-3{% if 'form-horizontal' in form_class %} row{% endif %}{% if wrapper_class %} {{ wrapper_class }}{% endif %}{% if field.css_classes %} {{ field.css_classes }}{% endif %}{% if div.css_class %} {{ div.css_class }}{% endif %}" {{ div.flat_attrs }}>
    {% if field.label and form_show_labels %}
        <label for="{{ field.id_for_label }}" class="{% if 'form-horizontal' in form_class %}col-form-label {% else %}form-label {% endif %}{{ label_class }}{% if field.field.required %} requiredField{% endif %}">
            {{ field.label }}{% if field.field.required %}<span class="asteriskField">*</span>{% endif %}
        </label>
    {% endif %}

    <div{% if field_class %}class="{{ field_class }}"{% endif %}> <!-- Here -->
        <div class="input-group{% if input_size %} {{ input_size }}{% endif %}">
            {% if field.errors %}
                {% crispy_field field 'class' 'form-control is-invalid' %}
            {% else %}
                {% crispy_field field 'class' 'form-control' %}
            {% endif %}
            {{ buttons|safe }}
        </div>
        {% for error in field.errors %}
            <p id="error_{{ forloop.counter }}_{{ field.auto_id }}" class="text-danger mb-0"><small><strong>{{ error }}</strong></small></p>
        {% endfor %}
        {% include 'bootstrap5/layout/help_text.html' %}
    </div>
</div>

Просто пришлось добавить пробел в начале второго div, чтобы исправить проблему.

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