Skip to content

Instantly share code, notes, and snippets.

@robertowest
Created September 16, 2021 13:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save robertowest/dcc595ff201865ed2713c75563544d5a to your computer and use it in GitHub Desktop.
Save robertowest/dcc595ff201865ed2713c75563544d5a to your computer and use it in GitHub Desktop.
django: Agregando texto de ayuda al input de búsqueda en django site admin

búsqueda en django site admin

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 %}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment