Skip to main content

A Django app for build admin sites like django admin.

Project description

gmcm-django-superadmin

Framework para construir sitios de administración en Django de forma declarativa, al estilo de django.contrib.admin pero pensado para portales internos/públicos propios (no el /admin). Registras un modelo, declaras qué campos mostrar y la librería genera automáticamente las vistas CRUD, el listado con filtros y búsqueda, el detalle, los formularios, el menú dinámico y los permisos.


Instalación

pip install gmcm-django-superadmin
# settings.py
INSTALLED_APPS = [
    # ...
    "superadmin",
]

TEMPLATES = [
    {
        # ...
        "OPTIONS": {
            "context_processors": [
                # ...
                "superadmin.context_processors.menu",  # menú lateral por usuario
            ],
        },
    },
]
# urls.py
import superadmin

urlpatterns = [
    # ...
    path("", superadmin.site.urls),
]
python manage.py migrate

Quick start

# myapp/sites.py
from superadmin import ModelSite, register


@register("myapp.Product")
class ProductSite(ModelSite):
    list_fields = ("code", "name", "category__name:Categoría", "price", "is_active")
    detail_fields = (
        ("code", "name"),
        ("category", "price"),
        "description",
    )
    search_params = ("name__icontains", "code__icontains")
    filter_fields = ("category", "is_active", "price")

Los módulos sites.py de cada app se autodescubren. Eso genera, para Product:

URL Vista
/myapp/product/ Listado (filtros + búsqueda + paginación + export)
/myapp/product/create/ Alta
/myapp/product/<pk>/update/ Edición
/myapp/product/<pk>/detail/ Detalle
/myapp/product/<pk>/delete/ Baja
/myapp/product/export/ Exportar listado (CSV/XLSX)

Referencia de ModelSite

Campos y presentación

Atributo Descripción
list_fields Columnas del listado. Soporta traversal (a__b__c), métodos del modelo y alias "campo:Etiqueta".
detail_fields Campos del detalle. Tupla (filas), tuplas anidadas (columnas Bootstrap automáticas) o dict (secciones con título).
list_formatters {campo: callable(valor, instancia)} para pintar badges/moneda/colores sin tocar el modelo.
detail_formatters Igual que list_formatters, para el detalle.
fields / form_class Campos o formulario para crear/editar. Si no se define, usa __all__.

Listado, filtros y búsqueda

Atributo Descripción
search_params Campos para la búsqueda de texto (ej. ("name__icontains",)).
filter_fields Campos filtrables en el panel lateral. Soporta alias "campo:Etiqueta".
paginate_by Tamaño de página.
order_by Campos de ordenamiento.

Rendimiento

Atributo Descripción
queryset Queryset base.
list_queryset / detail_queryset / ... Queryset por acción (override del base solo para esa vista).
auto_optimize_queryset True por defecto: deriva select_related/prefetch_related automáticamente desde list_fields/detail_fields (evita N+1).

Comportamiento

Atributo Descripción
allow_views Vistas a generar: ("list","create","update","detail","delete").
readonly_check callable(instancia) -> bool. Si devuelve True, edición y borrado se bloquean y redirigen al detalle con un mensaje.
allow_export Habilita el endpoint de export (CSV/XLSX).
export_fields Campos a exportar (por defecto, list_fields).
inlines Formsets inline para create/update.
prepopulate_slug Campos desde los que autogenerar el slug.
*_mixins list_mixins, form_mixins, create_mixins, update_mixins, detail_mixins, delete_mixins.
*_template_name Plantilla por acción.

Filtros lazy (Select2 / FK grandes)

Para listados con ForeignKeys a tablas grandes, además del FilterView clásico hay endpoints optimizados que cargan opciones por AJAX paginado (Select2 los cachea al hacer scroll) con un mínimo de caracteres antes de buscar:

Endpoint Uso
GET filtering/metadata/<app>/<model>/ Metadata de todos los filtros del sitio (cacheada). Los FK/O2O/M2M vienen con lazy: true y minimum_input_length, sin opciones inline.
GET filtering/search/<app>/<model>/<field>/?q=&page= Búsqueda paginada (formato Select2 {results, pagination:{more}}) para los campos lazy.
POST filtering/count/<app>/<model>/ Conteo en vivo de cuántas filas devolverían los filtros candidatos.

El frontend conecta un <select> lazy a search vía la config ajax de Select2 con minimumInputLength. El FilterView clásico (filter/<app>/<model>/<field>/) sigue disponible y ahora también acepta ?q= para buscar.


Exportar listados

Con allow_export = True (por defecto) el listado expone export/, que respeta los filtros y la búsqueda activos de la sesión:

  • ?format=csv (sin dependencias)
  • ?format=xlsx (requiere openpyxl)

Requiere el permiso view_<model>.


Acciones masivas

  • POST <model>/update/ — actualiza un campo en varios registros (valida el campo y castea el valor con to_python, dentro de una transacción).
  • POST <model>/delete/ — elimina varios registros.

Menú dinámico

El menú lateral se modela en base de datos (Menu / Action), respeta permisos por usuario y se renderiza con el context processor superadmin.context_processors.menu. El árbol por usuario se cachea y se invalida automáticamente al cambiar un Menu.


Settings disponibles

Setting Default Descripción
SUPERADMIN_SAVE_SUCCESS_MESSAGE "Se ha guardado correctamente." Mensaje al guardar.
SUPERADMIN_DELETE_SUCCESS_MESSAGE "Se ha eliminado correctamente." Mensaje al eliminar.
SUPERADMIN_READONLY_MESSAGE "Este registro no puede modificarse…" Mensaje del guard readonly_check.
SUPERADMIN_MENU_CACHE_TIMEOUT 300 Segundos de caché del menú por usuario.
SUPERADMIN_FILTER_PAGE_SIZE 20 Tamaño de página del search lazy.
SUPERADMIN_FILTER_MIN_INPUT_LENGTH 2 Caracteres mínimos para buscar en filtros lazy.
SUPERADMIN_FILTER_METADATA_CACHE_TIMEOUT 300 Caché de la metadata de filtros.
BOOLEAN_YES / BOOLEAN_NO "Yes" / "No" Etiquetas booleanas.

System checks

python manage.py check valida que los list_fields / detail_fields de cada sitio apunten a campos resolubles (atrapa typos en deploy, no en runtime con un AttributeError en cara del usuario).


Desarrollo y tests

python runtests.py

Suite con el test runner nativo de Django (sin dependencias extra). El CI (.gitlab-ci.yml) corre los tests en Python 3.8/Django 3.2 y Python 3.11/Django 4.2, y publica automáticamente al hacer push a master (usando las variables TWINE_USERNAME / TWINE_PASSWORD de CI/CD).


Compatibilidad

  • Python 3.8 – 3.12
  • Django 3.2 – 4.2

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

gmcm_django_superadmin-2.2.1.tar.gz (42.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

gmcm_django_superadmin-2.2.1-py3-none-any.whl (54.5 kB view details)

Uploaded Python 3

File details

Details for the file gmcm_django_superadmin-2.2.1.tar.gz.

File metadata

  • Download URL: gmcm_django_superadmin-2.2.1.tar.gz
  • Upload date:
  • Size: 42.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.15

File hashes

Hashes for gmcm_django_superadmin-2.2.1.tar.gz
Algorithm Hash digest
SHA256 3753e611cab6755195c3075708d2bafeb1bc375d7ead11042dcaaafd4388aef7
MD5 4a4ef283af585eb76521df24eb6d8287
BLAKE2b-256 a523bed0be3c7c8a05bf9d55de5f7d6cbc7dda801421aeb0570721deadd58fa7

See more details on using hashes here.

File details

Details for the file gmcm_django_superadmin-2.2.1-py3-none-any.whl.

File metadata

File hashes

Hashes for gmcm_django_superadmin-2.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 76cb5ba123ba3a7238a0e8725ff970f13af8d5777002383654a0f227bf00a3d7
MD5 17f8539c196913f92f61a7fa3e45c6b9
BLAKE2b-256 22c87108761851f23b070aede4750a3bded930795f483f139cf1ffc902d1d7e0

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page