Применение Bulma css к выпадающему меню Django
Как применить css из bulma к моему полю Django, которое является выпадающим меню, используя виджет=forms.Select.
Bulma CSS: с сайта bulma.io, их пример реализации:
<div class="dropdown is-active">
<div class="dropdown-trigger">
<button class="button" aria-haspopup="true" aria-controls="dropdown-menu">
<span>Dropdown button</span>
<span class="icon is-small">
<i class="fas fa-angle-down" aria-hidden="true"></i>
</span>
</button>
</div>
<div class="dropdown-menu" id="dropdown-menu" role="menu">
<div class="dropdown-content">
<a href="#" class="dropdown-item">
Dropdown item
</a>
<a class="dropdown-item">
Other dropdown item
</a>
<a href="#" class="dropdown-item is-active">
Active dropdown item
</a>
<a href="#" class="dropdown-item">
Other dropdown item
</a>
<hr class="dropdown-divider">
<a href="#" class="dropdown-item">
With a divider
</a>
</div>
</div>
</div>
Вот что я пробовал:
forms.py:
class PostModelForm(forms.ModelForm):
STATUS=[
('live', 'Live'),
('draft', 'Draft'),
]
status = forms.CharField(label='Status', widget=forms.Select(choices=STATUS))
class Meta:
model = Post
fields = (
'status',
)
def __init__(self, *args, **kwargs):
super(PostModelForm, self).__init__(*args, **kwargs)
self.fields['status'].widget.attrs.update({'class': 'dropdown-menu','id': 'dropdown-menu', 'role': 'menu'})
models.py
class Post(models.Model):
status = models.CharField(default='draft', max_length=10)
post.html
<form method="post">
{{ form.status.errors }}
<p class="title">Status</p>
<div class="dropdown is-active">
<div class="dropdown-trigger">
<button class="button" aria-haspopup="true" aria-controls="dropdown-menu">
<span>Select status</span>
<span class="icon is-small">
<i class="fas fa-angle-down" aria-hidden="true"></i>
</span>
</button>
</div>
{{ form.status }}
</div>
{% csrf_token %}
<div class="control">
<button type="submit" class="button">Submit</button>
</div>
</form>
Дополнительная информация. Я сохранил форму короткой для вопроса, но я успешно реализовал другие поля с помощью bulma css подобным образом, примером может служить виджет загрузки файлов:
{{ form.photo.errors }}
<p class="title is-5 is-full mb-2 mt-4">Image</p>
<div id="file-js-example" class="file has-name is-fullwidth mb-4">
<label class="file-label">
{{ form.photo }}
<span class="file-cta">
<span class="file-icon">
<i class="fas fa-upload"></i>
</span>
<span class="file-label">
Image
</span>
</span>
<span class="file-name">
No image selected
</span>
</label>
</div>
<script>
const fileInput = document.querySelector('#file-js-example input[type=file]');
fileInput.onchange = () => {
if (fileInput.files.length > 0) {
const fileName = document.querySelector('#file-js-example .file-name');
fileName.textContent = fileInput.files[0].name;
}
}
</script>
Я хочу сделать эквивалент для выпадающего меню. Я просто не уверен, какие элементы css нужно поместить в виджет формы.attrs и какие элементы bulma css нужно обернуть в мой {{ form.status }}, чтобы применить css. На данный момент я получаю два выпадающих меню, одно из bulma и одно из моего {{ form.status }}.
Спасибо
Обновление: Я получил выпадающий список, который работает и сохраняется в модели, единственное, что он отображается как обычная кнопка, поскольку я поместил класс кнопки в widget.attrs. Не уверен, как я могу расширить attrs, чтобы включить класс маленькой иконки стрелки вниз, чтобы она выглядела как выпадающая кнопка.
Стрелка вниз от бульмы:
<span class="icon is-small">
<i class="fas fa-angle-down" aria-hidden="true"></i>
</span>
Но это должно быть внутри кнопки, которую я определил в widget.attrs.
Текущий код, который заставляет работать выпадающий список, заключается в изменении attrs виджета:
forms.py:
self.fields['status'].widget.attrs.update({'class': 'button','aria-haspopup=': 'true', 'aria-controls': 'dropdown-menu'})
post.html
{{ form.status.errors }}
<p class="title">Status</p>
<div class="dropdown is-active">
{{ form.status }}
</div>
Я просто не уверен, как получить доступ к {{ form.status }}, чтобы вставить стрелку вниз в кнопку, или как добавить несколько классов в widget.attrs, чтобы иметь кнопку с классом иконки внутри класса кнопки.