如何为django admin搜索search_fields添加搜索框提示文字?

微信截图_20210812122620.png

如上图所示django admin在ModelAdmin中添加search_fields便可显示一个搜索框,可是不能设置搜索框的提示文字,在实际开发中要让使用的人知道输入什么能够进行快速检索,是一个快速提高用户体验的方法,在网上找了不少,也没有很好的解决这个问题,今天咱们就动手实现一个!html

我这里已经经过下方命令建立了一个名为dadmin的apppython

python manage.py startapp dadmin
复制代码

在dadmin目录下新建一个templatetags的文件夹,而且在其内部建立一个search_with_placeholder.py的文件,内部代码以下:git

# dadmin/templatetags/search_with_placeholder.py

from django.contrib.admin.templatetags.admin_list import (register, search_form)
from django.contrib.admin.templatetags.base import InclusionAdminNode


def search_form_plus(cl, search_placeholder: str = ""):
    """ Display a search form for searching the list with placeholder. """
    return dict(search_form(cl), search_placeholder=search_placeholder)


@register.tag(name='search_form_plus')
def search_form_tag(parser, token):
    return InclusionAdminNode(parser, token, func=search_form_plus, template_name='search_form_plus.html', takes_context=False)
复制代码

在与项目同级别,也就是根目录,建立一个templates的目录,再在其内部建立一个admin文件夹,重写admin的任何默认模板只须要放到这个文件夹便可,这也是修改django admin默认模板最简便的方法,咱们在其内部建立一个search_form_plus.html的文件,内部代码以下:web

{% load i18n static %}
{% if cl.search_fields %}
<div id="toolbar"><form id="changelist-search" method="get">
<div><!-- DIV needed for valid HTML -->
<label for="searchbar"><img src="{% static "admin/img/search.svg" %}" alt="Search"></label>
<input type="text" size="40" name="{{ search_var }}" value="{{ cl.query }}" placeholder="{{ search_placeholder }}" id="searchbar" autofocus>
<input type="submit" value="{% translate 'Search' %}">
{% if show_result_count %}
    <span class="small quiet">{% blocktranslate count counter=cl.result_count %}{{ counter }} result{% plural %}{{ counter }} results{% endblocktranslate %} (<a href="?{% if cl.is_popup %}_popup=1{% endif %}">{% if cl.show_full_result_count %}{% blocktranslate with full_result_count=cl.full_result_count %}{{ full_result_count }} total{% endblocktranslate %}{% else %}{% translate "Show all" %}{% endif %}</a>)</span>
{% endif %}
{% for pair in cl.params.items %}
    {% if pair.0 != search_var %}<input type="hidden" name="{{ pair.0 }}" value="{{ pair.1 }}">{% endif %}
{% endfor %}
</div>
</form></div>
{% endif %}
复制代码

再在dadmin目录下建立一个templates/dadmin的文件夹路径,再在其内部建立一个change_list.html的文件,内部代码以下:django

<!-- 完整文件路径,这是注释,模板中能够删掉 dadmin/templates/dadmin/change_list.html -->

{% extends 'admin/change_list.html' %}
{% load search_with_placeholder %}
{% block search %}{% search_form_plus cl search_placeholder %}{% endblock %}
复制代码

以后在dadmin目录中的admin.py中定义一个全部ModelAdmin的基础类BaseAdmin,之后全部用到ModelAdmin的地方咱们都继承BaseAdmin便可,代码以下:api

class BaseAdmin(admin.ModelAdmin):
	change_list_template = "dadmin/change_list.html"
	
	def changelist_view(self, request, extra_context=None):
        # 列表视图, 添加search_placeholder = ""
        # 便可定义搜索框的值,也能够向列表页得传进任何数据
        search_placeholder = getattr(self, "search_placeholder", False)
        if search_placeholder:
            extra_context = extra_context or {}
            extra_context["search_placeholder"] = search_placeholder
        return super().changelist_view(request, extra_context=extra_context)
复制代码

使用也很是简单,全部的ModelAdmin都只须要继承他便可,以下例所示:微信

class CategoryModelAdmin(BaseAdmin):
    """ 分类管理配置 """

    list_display = ('id', 'name', 'is_show', 'cate_icon',
                    'sort',  'add_date', 'operate')
    search_fields = ('name',)  # 设置搜索框
    search_placeholder = '请输入分类名称搜索'  # 设置搜索框的提示文字

admin.site.register(CategoryModel, CategoryModelAdmin)
复制代码

其余列表页也须要设置搜索框文字,继承BaseAdmin便可,很是简单,直接拿去使用吧!markdown

相关源代码请参考:gitee.com/xingfugz/dj…app

若是你也在学习Django,那么欢迎点赞 评论交流学习,欢迎star以上项目,给个鼓励,也欢迎您能关注个人公众号“幸福关中”,一块儿学习交流,上边有不少学习资料哦!svg