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

如何在Django中实现带搜索功能的下拉选择栏?

实现带搜索功能的下拉选择框

先修正视图代码(必填)

当前views.py未将表单传入模板上下文,会导致表单无法正确渲染,先做如下修改:

def product(request):
    items = Product.objects.all()
    if request.method == 'POST':
        form = ProductForm(request.POST, request.FILES)
        if form.is_valid():
            form.save()
            # 保存成功后重置表单
            form = ProductForm()
    else:
        form = ProductForm()

    context = {
        'items': items,
        'form': form,  # 必须将form传入上下文
    }
    return render(request, 'products.html', context)

方案一:使用Select2实现(快捷高效)

Select2是成熟的下拉增强工具,支持搜索过滤、多选等功能,集成成本低:

1. 准备本地资源

将Select2的CSS和JS文件下载到项目静态资源目录(如static/css/、static/js/),避免依赖外部链接。

2. 修改表单字段Widget

在forms.py中给asset_type字段添加标识类,方便后续初始化:

from django import forms
from .models import Product

class ProductForm(forms.ModelForm):
    class Meta:
        model = Product
        fields = ['model_name', 'asset_type']
        widgets = {
            'asset_type': forms.Select(attrs={'class': 'select2'}),
        }

3. 模板中引入资源并初始化

修改products.html,添加资源引入和初始化脚本:

<div class="container">
    <div class="row my-1">
        <h4>Enroll a product:</h4>
        <hr>
    </div>
        
    <form method="POST" enctype="multipart/form-data">
        {% csrf_token %}
        {{ form|crispy }}
        <input class="btn btn-success btn-block" type="submit" value="Add Product">
        <button type="button" class="btn btn-danger btn-block">Close</button>
    </form>
</div>

<!-- 引入本地静态资源 -->
<link rel="stylesheet" href="{% static 'css/select2.min.css' %}">
<script src="{% static 'js/jquery.min.js' %}"></script> <!-- Select2依赖jQuery -->
<script src="{% static 'js/select2.min.js' %}"></script>

<!-- 初始化Select2 -->
<script>
$(document).ready(function() {
    $('.select2').select2({
        placeholder: "选择资产类型",
        allowClear: true,
        width: '100%'
    });
});
</script>

方案二:纯前端自定义实现(无外部依赖)

如果不想引入第三方工具,可通过原生JS实现搜索过滤:

修改模板渲染逻辑

手动渲染asset_type字段,添加搜索输入框和过滤脚本:

<div class="container">
    <div class="row my-1">
        <h4>Enroll a product:</h4>
        <hr>
    </div>
        
    <form method="POST" enctype="multipart/form-data">
        {% csrf_token %}
        <!-- 保留原有model_name字段渲染 -->
        <div class="mb-3">
            {{ form.model_name.label_tag }}
            {{ form.model_name }}
        </div>
        
        <!-- 自定义带搜索的下拉框 -->
        <div class="mb-3">
            <label for="asset_type">资产类型</label>
            <input type="text" id="asset-search" class="form-control mb-2" placeholder="搜索资产类型...">
            <select id="asset_type" name="asset_type" class="form-control">
                <option value="">-- 选择类型 --</option>
                {% for value, label in form.asset_type.field.choices %}
                    <option value="{{ value }}">{{ label }}</option>
                {% endfor %}
            </select>
        </div>

        <input class="btn btn-success btn-block" type="submit" value="Add Product">
        <button type="button" class="btn btn-danger btn-block">Close</button>
    </form>
</div>

<!-- 实时过滤脚本 -->
<script>
const searchInput = document.getElementById('asset-search');
const selectOptions = document.querySelectorAll('#asset_type option');

searchInput.addEventListener('input', function() {
    const searchTerm = this.value.toLowerCase();
    selectOptions.forEach(option => {
        const optionText = option.textContent.toLowerCase();
        // 保留默认空选项,仅过滤其他选项
        if (option.value === '') {
            option.style.display = 'block';
        } else {
            option.style.display = optionText.includes(searchTerm) ? 'block' : 'none';
        }
    });
});
</script>

功能说明

  • 输入内容时实时过滤下拉选项,仅显示包含关键词的结果
  • 保留默认空选项,支持清空选择
  • 无外部依赖,纯原生JS实现

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 22:27:19