Django Autocomplete Light 是一个强大的库,用于在 Django 管理界面中实现自动完成功能。如果你想要覆盖默认的行为并返回自定义值的 HTML 选项,你可以通过以下步骤来实现:
首先,你需要创建一个自定义视图来处理自动完成的请求,并返回自定义的 HTML 选项。
# myapp/views.py
from django.http import JsonResponse
from django.views import View
from .models import MyModel
class MyModelAutocompleteView(View):
def get(self, request, *args, **kwargs):
# 获取查询参数
query = request.GET.get('q', '')
# 根据查询参数过滤模型实例
results = MyModel.objects.filter(name__icontains=query)[:5]
# 构建自定义的 HTML 选项
options = []
for result in results:
option = f'<option value="{result.id}">{result.name} - {result.custom_field}</option>'
options.append(option)
# 返回 JSON 响应,包含自定义的 HTML 选项
return JsonResponse({'results': options})
接下来,你需要配置 URL 来指向你的自定义视图。
# myapp/urls.py
from django.urls import path
from .views import MyModelAutocompleteView
urlpatterns = [
path('autocomplete/mymodel/', MyModelAutocompleteView.as_view(), name='mymodel_autocomplete'),
]
在你的 Django 管理文件中,更新 Autocomplete Light 的配置以使用你的自定义视图。
# myapp/admin.py
from django.contrib import admin
from autocomplete_light import shortcuts as autocomplete_light
from .models import MyModel
class MyModelAdmin(autocomplete_light.ModelAdmin):
autocomplete_fields = {
'mymodel_field': ('myapp:autocomplete:mymodel',),
}
admin.site.register(MyModel, MyModelAdmin)
最后,确保你的模板能够正确渲染返回的自定义 HTML 选项。你可能需要自定义 Autocomplete Light 的模板来处理这些选项。
<!-- myapp/templates/autocomplete_light/select2.html -->
{% extends "autocomplete_light/select2.html" %}
{% block select2_options %}
{{ block.super }}
<script>
$(document).ready(function() {
$('#id_mymodel_field').on('select2:select', function(e) {
var data = e.params.data;
$('#id_mymodel_field').val(data.id);
$('#id_mymodel_field option:selected').text(data.text);
});
});
</script>
{% endblock %}
领取专属 10元无门槛券
手把手带您无忧上云