¿Cómo puedo cambiar la opción de filtro predeterminada de 'TODOS'? Tengo un campo denominado como status
el que tiene tres valores: activate
, pending
y rejected
. Cuando lo uso list_filter
en el administrador de Django, el filtro está configurado de forma predeterminada en 'Todos', pero quiero configurarlo como pendiente de forma predeterminada.
python
django
django-admin
ha22109
fuente
fuente
choices
método en la solución, continuará agregando su propia opción Todas en la parte superior de la lista de opciones.fuente
Tomó la respuesta de ha22109 anterior y la modificó para permitir la selección de "Todos" comparando
HTTP_REFERER
yPATH_INFO
.fuente
KeyError
, mientras que si usa elget()
método del dict, puede especificar un valor predeterminado. Especifiqué un valor predeterminado de cadena vacía para que split () no arrojeAttributeError
. Eso es todo.has_key()
está en desuso a favor dekey in d
. Pero sé que acabas de tomar de la respuesta de ha22109. Una pregunta: ¿por qué usarlorequest.META['PATH_INFO']
cuando solo podría usarrequest.path_info
(más corto)?Sé que esta pregunta es bastante antigua ahora, pero sigue siendo válida. Creo que esta es la forma más correcta de hacer esto. Es esencialmente el mismo que el método de Greg, pero formulado como una clase extensible para una fácil reutilización.
fuente
Aquí está mi solución genérica usando redireccionamiento, solo verifica si hay algún parámetro GET, si no existe ninguno, entonces redirige con el parámetro get predeterminado. También tengo un list_filter configurado, por lo que lo recoge y muestra el valor predeterminado.
La única advertencia es cuando accedes directamente a la página con "?" presente en la URL, no hay HTTP_REFERER configurado, por lo que usará el parámetro predeterminado y redireccionará. Esto está bien para mí, funciona muy bien cuando haces clic en el filtro de administración.
ACTUALIZAR :
Para evitar la advertencia, terminé escribiendo una función de filtro personalizada que simplificó la funcionalidad changelist_view. Aquí está el filtro:
Y changelist_view ahora solo pasa el parámetro predeterminado si no hay ninguno presente. La idea era deshacerse de la capacidad de los filtros genéricos para ver todo sin usar parámetros de obtención. Para ver todo lo que asigné el estado = 8 para ese propósito:
fuente
fuente
Simplemente puede usar
return queryset.filter()
oif self.value() is None
y el método Override de SimpleListFilterfuente
Tenga en cuenta que si en lugar de preseleccionar un valor de filtro, siempre desea filtrar previamente los datos antes de mostrarlos en el administrador, debe anular el
ModelAdmin.queryset()
método.fuente
Una ligera mejora en la respuesta de Greg usando DjangoChoices, Python> = 2.5 y, por supuesto, Django> = 1.4.
¡Gracias a Greg por la buena solución!
fuente
Sé que no es la mejor solución, pero cambié el index.html en la plantilla de administración, línea 25 y 37 así:
25:
<th scope="row"><a href="{{ model.admin_url }}{% ifequal model.name "yourmodelname" %}?yourflag_flag__exact=1{% endifequal %}">{{ model.name }}</a></th>
37:
<td><a href="{{ model.admin_url }}{% ifequal model.name "yourmodelname" %}?yourflag__exact=1{% endifequal %}" class="changelink">{% trans 'Change' %}</a></td>
fuente
Tuve que hacer una modificación para que el filtrado funcionara correctamente. La solución anterior funcionó para mí cuando se cargó la página. Si se realizó una 'acción', el filtro volvió a 'Todo' y no a mi predeterminado. Esta solución carga la página de cambio de administrador con el filtro predeterminado, pero también mantiene los cambios de filtro o el filtro actual cuando ocurre otra actividad en la página. No he probado todos los casos, pero en realidad puede estar limitando la configuración de un filtro predeterminado para que ocurra solo cuando se carga la página.
fuente
Un poco fuera de tema, pero mi búsqueda de una pregunta similar me llevó aquí. Estaba buscando tener una consulta predeterminada por fecha (es decir, si no se proporciona ninguna entrada, mostrar solo los objetos con
timestamp
"Hoy"), lo que complica un poco la pregunta. Esto es lo que se me ocurrió:Esta es una simple anulación del valor predeterminado
DateFieldListFilter
. Al establecerloself.date_params
, asegura que el menú desplegable del filtro se actualizará a cualquier opción que coincida con elself.used_parameters
. Por esta razón, debe asegurarse de queself.used_parameters
sean exactamente lo que usaría una de esas selecciones desplegables (es decir, averigüe cuáldate_params
sería cuando use 'Hoy' o 'Últimos 7 días' y construya elself.used_parameters
para que coincida con esos).Esto fue creado para funcionar con Django 1.4.10
fuente
Este puede ser un hilo antiguo, pero pensé en agregar mi solución ya que no pude encontrar mejores respuestas en las búsquedas de Google.
Haga lo que (no estoy seguro de si es Deminic Rodger o ha22109) respondió en ModelAdmin para changelist_view
Entonces necesitamos crear un SimpleListFilter personalizado
fuente
Aquí está la versión más limpia que pude generar de un filtro con un 'Todo' redefinido y un valor predeterminado que está seleccionado.
Si me muestra por defecto los viajes que están ocurriendo actualmente.
fuente
Creó una subclase de filtro reutilizable, inspirada en algunas de las respuestas aquí (principalmente las de Greg).
Ventajas:
Reutilizable : conectable en cualquier
ModelAdmin
clase estándarAmpliable : fácil de agregar lógica adicional / personalizada para el
QuerySet
filtradoFácil de usar : en su forma más básica, solo es necesario implementar un atributo personalizado y un método personalizado (aparte de los requeridos para la subclasificación de SimpleListFilter)
Administración intuitiva : el enlace del filtro "Todos" funciona como se esperaba; como son todos los demas
Sin redirecciones : no es necesario inspeccionar la
GET
carga útil de la solicitud, agnóstica deHTTP_REFERER
(o cualquier otra cosa relacionada con la solicitud, en su forma básica)Sin manipulación de vistas (lista de cambios) , y sin manipulaciones de plantillas (Dios no lo quiera)
Código:
(la mayoría de las
import
s son solo para sugerencias de tipo y excepciones)Ejemplo de uso completo:
Espero que esto ayude a alguien; comentarios siempre apreciados.
fuente