如何在Django Admin中实现在线搜索和智能提示

2023-04-11 00:00:00 提示 在线 智能

要在Django Admin中实现在线搜索和智能提示,需要进行以下几个步骤:

  1. 在需要进行搜索的模型中,定义搜索字段

例如,我们在一个名为“Product”的模型中需要进行搜索和提示,可以在模型中添加一个名为“name”的CharField,并加上“db_index=True”来进行优化:

class Product(models.Model):
    name = models.CharField(max_length=255, db_index=True)
  1. 创建Admin类并添加search_fields

在Admin类中添加“search_fields”属性,以指定需要搜索的字段。同时,也需要在Admin类中添加一个名为“autocomplete_fields”的属性,并将需要进行自动完成(即智能提示)的字段添加到其中。

class ProductAdmin(admin.ModelAdmin):
    search_fields = ('name',)
    autocomplete_fields = ('name',)

admin.site.register(Product, ProductAdmin)
  1. 创建URL,并添加视图函数

在urls.py文件中添加一个URL,以作为自动完成(即智能提示)的请求地址。并在views.py文件中为该URL添加一个视图函数,使用“icontains”查询搜索结果。

from django.urls import path
from .views import ProductAutocompleteView

urlpatterns = [
    path('product_autocomplete/', ProductAutocompleteView.as_view(), name='product_autocomplete'),
]
from django.db.models import Q
from django.views import View
from django.http import JsonResponse
from .models import Product

class ProductAutocompleteView(View):
    def get(self, request):
        query = request.GET.get('term', '')
        products = Product.objects.filter(Q(name__icontains=query))
        results = []
        for product in products:
            product_json = {}
            product_json['label'] = product.name
            product_json['value'] = product.name
            results.append(product_json)
        return JsonResponse(results, safe=False)
  1. 添加Javascript代码

在Admin页面上添加Javascript脚本,以绑定搜索框和自动完成(即智能提示)功能。其中,需要使用jQuery和jQuery UI组件库。

{% extends "admin/base.html" %}
{% block extrahead %}
    <link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/smoothness/jquery-ui.css">
    <script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
    <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.min.js"></script>
    <script>
        $(function() {
            $("#id_name").autocomplete({
                source: "{% url 'product_autocomplete' %}",
                minLength: 1
            });
        });
    </script>
{% endblock %}

{% block content %}
    <div class="breadcrumbs">
        <a href="{% url 'admin:index' %}">{{ site_header|escape }}</a><a href="{% url 'admin:app_list' app_label %}">{{ app_label|title }}</a>
        › {{ title|capfirst }}
    </div>
    <h1>{{ title|capfirst }}</h1>
    <div id="changelist-search">
        <h2>{{ _('Search') }}</h2>
        <form method="get">
            <input type="text" name="q" value="{{ search_term }}" autofocus id="searchbar" />
            <input type="submit" value="{{ _('Search') }}" />
        </form>
    </div>
{% endblock %}

在上面的代码中,“{% extends "admin/base.html" %}”表示继承Admin默认模板。在“{% block extrahead %}”区域中,我们添加了jQuery和jQuery UI组件库的链接,并在脚本中绑定了自动完成(即智能提示)功能。在“{% block content %}”区域中,我们使用了一个名为“searchbar”的ID来标识搜索框的元素ID。

通过以上步骤,我们可以在Django Admin中实现在线搜索和智能提示功能,输入“pidancode.com”或“皮蛋编程”即可得到相关搜索结果。

相关文章