Algo que me resulta muy útil es poder agregarle un placeholder al input de búsqueda para saber que campos se están utilizando. En la imagen se puede leer el texto Búsqueda por DNI.
La forma de hacer esto no es recomendable ya que realizaré cambios es el código fuente de django, pero es una forma fácil y muy útil.
Suponiendo que tengo una aplicación llamada Persona, definimos nuestro admin.py.
# persona/admin.py
from django.contrib import admin
from persona.models import Persona
@admin.register(Persona)
class PersonaAdmin(admin.ModelAdmin):
list_display = ['id', 'nombre', 'apelido', 'documento']
search_fields = ['documento']
def __init__(self, model, admin_site):
self.search_fields_hint = "Búsqueda por DNI" # aquí está la magia
admin.ModelAdmin.__init__(self, model, admin_site)
Para poder utilizar el atributo search_fields_hint primero debemos definirlo, y es aquí dónde modificaremos un archivo perteneciente a django. El archivo en cuestión es options.py y se enceuntra en la ruta django/contrib/admin. En mi caso, utilizo un entorno virtual, por lo que lo encontraremos en la ubicación perteneciente al entorno. En mi caso:
/<proyecto>/.venv/lib/python3.7/site-packages/django/contrib/admin/options.py
En este archivo realizaremos los siguientes agregados:
class ModelAdmin(BaseModelAdmin):
"""Encapsulate all admin options and functionality for a given model."""
list_display = ('__str__',)
:
search_fields = ()
search_fields_hint = '' # agregamos esta línea
:
def get_changelist_instance(self, request):
"""
Return a `ChangeList` instance based on `request`. May raise
`IncorrectLookupParameters`.
"""
:
return ChangeList(
:
self.get_search_fields(request),
self.search_fields_hint, # agregamos esta línea
:
)
Y ahora agregamos el atributo al archivo principal que se encuentra en:
/<proyecto>/.venv/lib/python3.7/site-packages/django/contrib/admin/views/main.py
El atributo es search_fields_hint lo agregamos como parámetro de __init__
y lo agregamos a la definición.
class ChangeList:
search_form_class = ChangeListSearchForm
def __init__(self, request, model, list_display, list_display_links,
list_filter, date_hierarchy, search_fields, list_select_related,
list_per_page, list_max_show_all, list_editable,
model_admin, sortable_by, search_fields_hint):
self.model = model
:
self.search_fields = search_fields
self.search_fields_hint = search_fields_hint # agregamos esta línea
Para terminar solo nos queda agregar el atributo en nuestro template:
/<proyecto>/.venv/lib/python3.7/site-packages/django/contrib/admin/
templates/admin/search_form.html
Este archivo podría copiarse dentro de la carpeta template de nuestro proyecto y dejar el original sin tocar.
<!--
agregamos: placeholder="{{ cl.search_fields_hint }}"
-->
{% load i18n static %}
{% if cl.search_fields %}
<div id="toolbar">
<form id="changelist-search" method="get">
<div>
<label for="searchbar"><img src="{% static "admin/img/search.svg" %}" alt="Search"></label>
<input type="text" size="40" name="{{ search_var }}"
value="{{ cl.query }}" id="searchbar" autofocus
placeholder="{{ cl.search_fields_hint }}">
<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 %}