You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

django-autocomplete-light单选样式异常、交互故障求助

Django单选Autocomplete组件样式异常与聚焦故障求助

我在Django页面中同时使用了针对同一模型对象的单选和多选Autocomplete组件,多选组件运行完全正常,但单选组件存在两个问题:

  1. 样式显示不佳
  2. 存在轻微故障:需要额外点击才能进入输入框输入

单选组件样式异常截图


编辑1:移除多选框后,单选框的样式问题和故障仍然存在,说明二者问题无关。

编辑2:已强制刷新浏览器并尝试Firefox,排除了浏览器缓存资源过期的可能性。

编辑3:禁用Bootstrap表单改用普通表单后,异常行为有所减轻,但问题仍未完全解决。

禁用Bootstrap后的单选组件截图

目前判断样式问题大概率是django-autocomplete-light与django-bootstrap5的交互冲突导致。另外,原本以为单选框可以直接输入,实际点击后会弹出新输入框,这应该是Select2的预期行为,现在仅剩点击单选框时光标无法自动聚焦的问题需要解决。


环境与细节信息

  • Django 4.1.5
  • django-autocomplete-light 3.9.4
  • django-bootstrap5 22.2

生成的HTML代码

正常运行的多选组件:

<span
class="select2-selection
select2-selection--multiple
form-select"
role="combobox"
aria-haspopup="true"
aria-expanded="false"
tabindex="-1"
aria-disabled="false"><ul
class="select2-selection__rendered"><li
class="select2-search
select2-search--inline"><input
class="select2-search__field"
type="search"
tabindex="0"
autocomplete="off"
autocorrect="off"
autocapitalize="none"
spellcheck="false"
role="searchbox"
aria-autocomplete="list"
placeholder="Type
here"
style="width:
288px;"></li></ul></span>

.select2-container .select2-selection--multiple: min-height: 32px

故障的单选组件:

<span
class="select2-selection
select2-selection--single
form-select"
role="combobox"
aria-haspopup="true"
aria-expanded="false"
tabindex="0"
aria-disabled="false"
aria-labelledby="select2-id_primary_diagnosis-container"><span
class="select2-selection__rendered"
id="select2-id_primary_diagnosis-container"
role="textbox"
aria-readonly="true"><span
class="select2-selection__placeholder">Type
here</span></span><span
class="select2-selection__arrow"
role="presentation"><b
role="presentation"></b></span></span>

"display:inline prevents height:28px from having an effect"

表单代码(forms.py)

class MyobjForm(forms.Form):
    # NOTE: 因未展示的多种原因无法使用ModelForm
    single_select = forms.ModelChoiceField(
        label='single select',
        queryset=Myobj.objects.all(),
        widget=autocomplete.ModelSelect2(
            url="myobj-autocomplete",
            attrs={
                "data-placeholder": "Type here",
                # 输入1个字符后才触发自动补全
                "data-minimum-input-length": 1,
            },
        ),
    )
    multi_select = forms.ModelMultipleChoiceField(
        label='multi select',
        queryset=Myobj.objects.all(),
        required=False,
        widget=autocomplete.ModelSelect2Multiple(
            url="myobj-autocomplete",
            attrs={
                "data-placeholder": "Type here",
                # 输入1个字符后才触发自动补全
                "data-minimum-input-length": 1,
            },
        ),
    )

模板代码(templates)

{% load django_bootstrap5 %}

...

{% block head_script %}
    {# 引入jquery和表单媒体资源,确保django-autocomplete-light正常工作 #}
    <script type="text/javascript" src="{% static 'admin/js/vendor/jquery/jquery.js' %}"></script>
    {{labeledencounter_form.media}}
{% endblock head_script %}

 ...

 {% bootstrap_form myform %}

模板编译后的媒体头部内容

<script type="text/javascript" src="/static/admin/js/vendor/jquery/jquery.js"></script>
    <link href="/static/admin/css/vendor/select2/select2.css" media="screen" rel="stylesheet">
<link href="/static/admin/css/autocomplete.css" media="screen" rel="stylesheet">
<link href="/static/autocomplete_light/select2.css" media="screen" rel="stylesheet">
<script src="/static/admin/js/vendor/select2/select2.full.js"></script>
<script src="/static/autocomplete_light/autocomplete_light.js"></script>
<script src="/static/autocomplete_light/select2.js"></script>
<script src="/static/autocomplete_light/i18n/en.js"></script>

...

<label class="form-label" for="id_select_select">single select</label><select name="select_select" data-placeholder="Type here" data-minimum-input-length="1" class="form-select" required id="id_select_select" data-autocomplete-light-language="en" data-autocomplete-light-url="/myobj-autocomplete/" data-autocomplete-light-function="select2">
  <option value="" selected>---------</option>

</select></div><div class="mb-3"><label class="form-label" for="id_multi_select">multi select</label><select name="multi_select" data-placeholder="Type here" data-minimum-input-length="1" class="form-select" id="id_multi_select" data-autocomplete-light-language="en" data-autocomplete-light-url="/myobj-autocomplete/" data-autocomplete-light-function="select2" multiple>

补充截图

  • 正常运行的多选框展开状态:
    多选框展开状态

  • 故障单选框展开状态:
    单选框展开状态

  • Chrome调试器中正常的多选框:
    调试器中的多选框

  • Chrome调试器中故障的单选框:
    调试器中的单选框


内容的提问来源于stack exchange,提问作者dfrankow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 16:25:21