django admin search_fields placeholder 管理后台添加搜索框提示文字

本文主要介绍了django admin search_fields placeholder 管理后台添加搜索框提示文字,分享给大家,具体如下:

django admin search_fields placeholder 管理后台添加搜索框提示文字

如图, Django admin后台生成的搜索框, 默认是没有提示文字的, 不够友好; 网上也没搜到什么好的示例, 于是自己动手实现了一个

0. 已经存在的app名为carousel, 大致相当于如下操作/代码

$ python manage.py startapp carousel
# settings.py
```
INSTALLED_APPS = [
  ...
  \'carousel\',
]
```
# carousel/models.py
```
from django.db import models
 
class Carousel(models.Model):
  community = models.IntegerField(\'小区ID\')
  
  class Meta:
    verbose_name = verbose_name_plural = \'轮播设置\'
```

1. 定制模板标签templatetags

mkdir -p carousel/templatetags
touch carousel/templatetags/__init__.py
touch carousel/templatetags/search_with_placeholder.py
# carousel/templatetags/search_with_placeholder.py
from django.contrib.admin.templatetags.admin_list import (
  InclusionAdminNode,
  register,
  search_form,
)
 
 
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,
  )

2. 定制模板template

mkdir -p carousel/templates/admin
mkdir -p carousel/templates/custom_admin
touch carousel/templates/admin/search_form_plus.html
touch carousel/templates/custom_admin/change_list.html
<!-- carousel/templates/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 }}\" placeholder=\"{{ search_placeholder }}\" value=\"{{ cl.query }}\" 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 %}\" rel=\"external nofollow\" >{% 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 %}
<!-- carousel/templates/custom_admin/change_list.html -->
{% extends \"admin/change_list.html\" %}
{% load search_with_placeholder %}
 
{% block search %}{% search_form_plus cl search_placeholder %}{% endblock %}

3. 定制admin.py

cat carousel/admin.py

# Django3.1
from django.contrib import admin
 
from .models import BoxCarousel, Carousel,
 
 
class PlaceholderMixin:
  change_list_template = \"custom_admin/change_list.html\"
 
  def changelist_view(self, request, extra_context=None):
    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)
 
 
@admin.register(Carousel)
class CarouselAdmin(PlaceholderMixin, admin.ModelAdmin):
  search_fields = [\"=community\"]
  search_placeholder = \"请输入小区ID\"

其他列表页, 如果也想显示提示文字, 只需继承PlaceholderMixin, 然后定义search_placeholder就可以了

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容