如何為django admin搜尋search_fields新增搜尋框提示文字
如上圖所示django admin在ModelAdmin中新增search_fields即可顯示一個搜尋框,但是不能設定搜尋框的提示文字,在實際開發中要讓使用的人知道輸入什麼可以進行快速檢索,是一個快速提升使用者體驗的方法,在網上找了很多,也沒有很好的解決這個問題,今天我們就動手實現一個!
我這裡已經通過下方命令建立了一個名為dadmin的app
python manage.py startapp dadmin
在dadmin目錄下新建一個templatetags的資料夾,並且在其內部建立一個search_with_placeholder.py的檔案,內部程式碼如下:
# 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的檔案,內部程式碼如下:
{% 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的檔案,內部程式碼如下:
<!-- 完整檔案路徑,這是註釋,模板中可以刪掉 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即可,程式碼如下:
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即可,非常簡單,直接拿去使用吧!
相關原始碼請參考:https://gitee.com/xingfugz/django-mall
如果你也在學習django,那麼歡迎私信小編一起交流學習,歡迎star以上專案,給個鼓勵,也歡迎您能關注我的公眾號“幸福關中”,一起學習交流,上邊有很多學習資料哦!
一個賣酒的偽程式設計師,酒是生活,程式碼是夢想!