Django Forms: Атрибуты к элементу Select не применяются?
У меня есть Django Model Form, которую я отображаю в модальном окне. Она отображается нормально и у меня нет проблем , за исключением стилизации одного из выпадающих элементов .
Я могу добавлять/удалять классы в другие поля формы без проблем - но виджет Select не использует атрибуты, которые я ему даю.
Мой вопрос:
Виджет select в форме модели Django не применяет правильные классы
Мои попытки исправить:
- Я пробовал устанавливать атрибуты методом
__init__
- Устанавливал их так, как они есть сейчас (это рекомендованный метод из документации)
- Создание другой модели для расширения виджета Select, как описано здесь на SO
Мой код:
forms.py:
class EvaluationForm(forms.ModelForm):
"""Form definition for Evaluation."""
# THESE ATTRS LOAD FINE AND CLASSES APPLIED AS EXPECTED
evaluation_date = forms.CharField(
max_length=100,
widget=forms.TextInput(attrs={"class": "form-control test"}),
)
# THESE ATTRS ARE NOT BEING APPLIED TO THE SELECT WIDGET - NO CLASSES APPLIED
evaluation_level = forms.ModelChoiceField(
queryset=EvaluationLevel.objects.all(),
widget=forms.Select(
attrs={"class": "form-control something something-else"}
),
)
class Meta:
"""Meta definition for Evaluationform."""
model = Evaluation
fields = [
"summative",
"evaluation_type",
"evaluation_level",
"evaluation_date",
]
widgets = {
"summative": forms.HiddenInput(),
"evaluation_type": forms.HiddenInput(),
}
шаблон html, который отображает форму:
{% if form.non_field_errors %}
<ul>
{% for error in form.non_field_errors %}
<li>{{ error }}</li>
{% endfor %}
</ul>
{% endif %}
{% for hidden_field in form.hidden_fields %}
{% if hidden_field.errors %}
<ul>
{% for error in hidden_field.errors %}
<li>
(Hidden field {{ hidden_field.name }}) {{ error }}
</li>
{% endfor %}
</ul>
{% endif %}
{{ hidden_field }}
{% endfor %}
{% for field in form.visible_fields %}
<div id="{{field.auto_id}}FormGroup" class="form-group">
<label class="form-label" for="{{ field.id_for_label }}">{{ field.label }}</label>
{{ field }}
{% if field.help_text %}
<p class="help">{{ field.help_text|safe }}</p>
{% endif %}
<div class="invalid-feedback">
This field is required.
{% for error in field.errors %}
{{ error }}
{% endfor %}
</div>
</div>
{% endfor %}
Соответствующие модели:
class Evaluation(CreateUpdateMixin, CreateUpdateUserMixin):
"""
Model definition for Evaluation.
"""
summative = models.ForeignKey(Summative, on_delete=models.PROTECT)
evaluation_type = models.ForeignKey(
EvaluationType, on_delete=models.PROTECT
)
evaluation_level = models.ForeignKey(
EvaluationLevel, on_delete=models.PROTECT
)
evaluation_date = models.DateField(
auto_now=False, auto_now_add=False, null=True, blank=True
)
published = models.BooleanField(default=False)
employee_locked = models.BooleanField(default=False)
admin_locked = models.BooleanField(default=False)
admin_locked_by_id = models.IntegerField(null=True, blank=True)
objects = models.Manager()
managers = EvaluationManager()
class Meta:
"""Meta definition for Evaluation."""
verbose_name = "Evaluation"
verbose_name_plural = "Evaluations"
Мой вопрос:
Как заставить виджет Select правильно применить к нему нужные классы? Я пытаюсь добавить стилизацию Bootstrap к виджету.