sqlmigrate - documentacion de django
¿Cómo cambiar el filtro de administración de Django para usar un menú desplegable en lugar de una lista? (8)
Si, para un campo que desea filtrar, tiene más de ~ 10 valores, la barra lateral de filtrado comienza a ser fea y más difícil de usar.
Estoy buscando una solución para reemplazar <li>
con una selección desplegable (combobox) o algo similar que solucione el mismo problema.
Gracias @beholderrk, @gedas y @ jk-laiho! Empaqueté esto en una aplicación reutilizable .
Instalar:
pip install django-admin-list-filter-dropdown
Habilitar en settings.py
:
INSTALLED_APPS = (
...
''django_admin_listfilter_dropdown'',
...
)
Usar en admin.py
:
from django_admin_listfilter_dropdown.filters import DropdownFilter, RelatedDropdownFilter
class EntityAdmin(admin.ModelAdmin):
...
list_filter = (
# for ordinary fields
(''a_charfield'', DropdownFilter),
# for related fields
(''a_foreignkey_field'', RelatedDropdownFilter),
)
Esto es lo que parece:
La mejor solución es crear una nueva plantilla en admin/filter.html
e implementar el código HTML sugerido por @beholderrk. Simplemente lo implementé para un cliente y funciona muy bien.
El problema con DropdownFilter and RelatedDropdownFilter
es que pierde la visualización adecuada. En lugar de las cadenas traducidas para Charfield(choices=xxx)
, mostrará True
, False
y así sucesivamente.
No puedo comentar las respuestas, así que las añadiré a la respuesta de beholderrk aquí.
- crear una nueva plantilla llamada
dropdown_filter.html
o similar - copia el código de filter.html de feincms a
dropdown_filter.html
crear una nueva clase de filtro en
filters.py
:from django.contrib.admin.filters import AllValuesFieldListFilter class DropdownFilter(AllValuesFieldListFilter): template = ''admin/dropdown_filter.html''
ahora puedes usar este filtro en tu clase de administrador:
class SomeAdmin(admin.ModelAdmin): # ... list_filter = ((''country'', DropdownFilter),)
¡Funciona genial!
Podría dar un ejemplo completo. se muestra como antes. aqui esta mi codigo
from django.contrib import admin from pages.models import Post, Device, DeviceType, DeviceModel, Ipaddress, DeviceGroup, Location,Department,Comment from django_admin_listfilter_dropdown.filters import DropdownFilter, RelatedDropdownFilter class CommentInline(admin.TabularInline): model = Comment class IpaddressAdmin(admin.ModelAdmin): prepopulated_fields = {''slug'': (''ipaddress'',)} # model=Ipaddress search_fields = [''ipaddress'', ] # list_display = (''ipaddress'', ''machinename'', ''user'', ''department'',''location'',) list_filter = ( (''user'', DropdownFilter), (''department'', RelatedDropdownFilter), (''location'', RelatedDropdownFilter), )
Puede copiar las plantillas de administrador de la instalación django en su carpeta templates / admin en su proyecto.
Luego deberá hacer cualquiera de las dos cosas en los formularios o plantillas en las que desea mostrar sus resultados:
Si está trabajando con un formulario, en el que le gustaría que las opciones de la lista se publiquen en una base de datos, en su model.py, en el campo que tiene sus opciones, coloque algunos de este modo:
choice = forms.IntegerField(widget=forms.Select(choices=CHOICES))
Si solo se muestra en una página, aparecerá una etiqueta de plantilla como esta:
<select> {% for choices in object.details.all %} <option> {{ object.choice }} </option> {% endfor %} </select>
Una opción fácil sería usar django-grappelli , que reemplaza todos los filtros con django-grappelli desplegables.
Utilice filter.html de feincms
{% load i18n %}
<script type="text/javascript">var go_from_select = function(opt) { window.location = window.location.pathname + opt };</script>
<h3>{{ title }}</h3>
<ul class="admin-filter-{{ title|cut:'' '' }}">
{% if choices|slice:"4:" %}
<li>
<select style="width: 95%;"
onchange="go_from_select(this.options[this.selectedIndex].value)">
{% for choice in choices %}
<option{% if choice.selected %} selected="selected"{% endif %}
value="{{ choice.query_string|iriencode }}">{{ choice.display }}</option>
{% endfor %}
</select>
</li>
{% else %}
{% for choice in choices %}
<li{% if choice.selected %} class="selected"{% endif %}>
<a href="{{ choice.query_string|iriencode }}">{{ choice.display }}</a></li>
{% endfor %}
{% endif %}
</ul>
http://djangosuit.com/ también ofrece menús desplegables para los filtros de lista.