Как добавить классы для формирования полей, динамически создаваемых Django? - PullRequest
0 голосов
/ 12 июня 2019

Я понял, как добавить классы в поля формы.У меня есть следующее:

# models.py
class Contact(AddressMixin, PhoneMixin):
    contact_id = models.AutoField(primary_key=True)
    name = models.CharField(_('name'), max_length=50, blank=False)
    company = models.CharField(_('company'), max_length=50, blank=True)
    photo = models.CharField(_('photo'), max_length=255, blank=True)
    notes = models.TextField(_('notes'), blank=True)
    created_on = models.DateField(auto_now_add=True)

# forms.py
class ContactForm(ModelForm):
    class Meta:
        model = Contact
        fields = ['name', 'company', 'photo', 'notes']
        widgets = {
            'name': forms.TextInput(attrs={'class': 'form-control'}),
            'company': forms.TextInput(attrs={'class': 'form-control'}),
            'photo': forms.TextInput(attrs={'class': 'form-control'}),
            'notes': forms.Textarea(attrs={'class': 'form-control'}),
        }

Магия заключается в class Meta, в частности в поле widgets.Именно здесь вы можете определить, какой класс идти на какое поле.Однако для каждого контакта я хочу добавить 1 или несколько телефонных номеров, чтобы у меня было следующее:

# models.py
class Phone(models.Model):
    entity = models.ForeignKey('PhoneMixin', on_delete=models.CASCADE)
    number = models.CharField(_('number'), max_length=50, blank=True)

class PhoneMixin(models.Model):
    phone_id = models.AutoField(primary_key=True)
    pass

# forms.py
class PhoneForm(ModelForm):
    class Meta:
        model = Phone
        exclude = ['entity']
        widgets = {
            'number': forms.TextInput(attrs={'class': 'form-control'}),
        }

Затем у меня есть набор форм, который, по моему мнению, является корнем проблемы:

PhoneFormSet = inlineformset_factory(
    Contact,
    Phone,
    form=PhoneForm,
    exclude=('entity',),
    extra=1
)

Я могу ошибаться, но я полагаю, что это набор форм, который добавляет поле для удаления.Это поле для удаления заканчивается как флажок в моей форме.Когда я проверял html для этого поля, он имел имя DELETE, поэтому я подумал, что это будет так же просто, как добавить класс в поле DELETE в форме Phone:

# forms.py
class PhoneForm(ModelForm):
    class Meta:
        model = Phone
        exclude = ['entity']
        widgets = {
            'number': forms.TextInput(attrs={'class': 'form-control'}),
            'DELETE': forms.CheckboxInput(attrs={'class': 'custom-control-input'}),

        }

ОднакоКажется, это не так.Я даже попробовал все строчные буквы, delete, но все равно не повезлоЯ подозреваю, что причина в том, что Django добавляет DELETE поле после , моя форма оценивается, но это только предположение.Поэтому мой вопрос:

Как добавить класс в поле DELETE, которое Django динамически добавил в форму Phone?

1 Ответ

0 голосов
/ 12 июня 2019

Вы можете добавить класс для удаления флажка в скрипте. Пожалуйста, обратитесь это.

<table class="table">

        {{ phone_form.management_form }}

        {% for form in phone_form.forms %}
            {% if forloop.first %}
                <thead>
                <tr>
                    {% for field in form.visible_fields %}
                        <th>{{ field.label|capfirst }}</th>
                    {% endfor %}
                </tr>
                </thead>
            {% endif %}
            <tr class="{% cycle 'row1' 'row2' %} phone_form_formset_row">
                {% for field in form.visible_fields %}
                    <td>
                        {# Include the hidden fields in the form #}
                        {% if forloop.first %}
                            {% for hidden in form.hidden_fields %}
                                {{ hidden }}
                            {% endfor %}
                        {% endif %}
                        {{ field.errors.as_ul }}
                        {{ field }}
                    </td>
                {% endfor %}
            </tr>
        {% endfor %}
    </table>

<script type="text/javascript" src="{% static 'formset/jquery.formset.js' %}"></script>
<script type="text/javascript">
        $('.phone_form_formset_row').formset({
            addText: '<button type="button" class="btn btn-info">Add Contact</button>',
            deleteText: '<button type="button" class="btn btn-danger">remove</button>',
            prefix: 'phone_set'
        });

</script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...