Django

Configurando el Admin

Creando nuestro primer superusuario

El superadmin es un usuario que tiene todos los permisos activados

python manage.py createsuperuser

Nos pedirá nombre de usuario, email y contraseña

Corremos nuestro server de desarrollo:

python manage.py runserver

Vamos al administrador: http://127.0.0.1:8000/admin/

Administrador de django

Hacer nuestra app de encuestas administrable

En encuestas/admin.py

from django.contrib import admin
from encuestas.models import Pregunta

admin.site.register(Pregunta)

admin

Clickeando en "Preguntas" obtenemos

Clickeando en "Que te pasa?" obtenemos

Personalizando el form

Editamos el archivo admin.py, para que quede:

from django.contrib import admin
from encuestas.models import Pregunta

class PreguntaAdmin(admin.ModelAdmin):
    fields = ['pub_date', 'texto_pregunta']

admin.site.register(Pregunta, PreguntaAdmin)

Personalizando el form

Agrupamos en fieldsets

from django.contrib import admin
from encuestas.models import Pregunta


class PreguntaAdmin(admin.ModelAdmin):
    fieldsets = [
        (None,               {'fields': ['texto_pregunta']}),
        (u'Información de fecha', {'fields': ['pub_date']}),
    ]

admin.site.register(Pregunta, PreguntaAdmin)

Personalizando el form

Hacemos los fieldsets colapsables

from django.contrib import admin
from encuestas.models import Pregunta


class PreguntaAdmin(admin.ModelAdmin):
    fieldsets = [
        (None,               {'fields': ['texto_pregunta']}),
        (u'Información de fecha', {'fields': ['pub_date'], 'classes': ['collapse']}),
    ]

admin.site.register(Pregunta, PreguntaAdmin)

Personalizando el form

Agregamos objetos relacionados

from django.contrib import admin
from encuestas.models import Eleccion, Pregunta
# ...
admin.site.register(Eleccion)

Personalizando el form

Agregamos mejor los objetos relacionados

from django.contrib import admin
from encuestas.models import Eleccion, Pregunta


class EleccionInline(admin.StackedInline):
    model = Eleccion
    extra = 3    # Aqui ndicamos la cantidad de "slots" que hay de elecciones, el 
                 # usuario puede agregar más si lo necesita


class PreguntaAdmin(admin.ModelAdmin):
    fieldsets = [
        (None,               {'fields': ['texto_pregunta']}),
        (u'Información de fecha', {'fields': ['pub_date'], 'classes': ['collapse']}),
    ]
    inlines = [EleccionInline]   # Le indicamos a Django que las elecciones se 
                                 # cargan desde el admin de Pregunta

admin.site.register(Pregunta, PreguntaAdmin)

Personalizando el form

Optimizamos el espacio de los objetos relacionados

class EleccionInline(admin.TabularInline):
    #...

Personalizando el listado

Podemos personalizar las columnas de los listados, con campos o con nuestros métodos personalizados

class PreguntaAdmin(admin.ModelAdmin):
    # ...
    list_display = ('texto_pregunta', 'pub_date', 
                    'fue_publicada_recientemente')

Personalizando el listado

Para los campos personalizados, debemos indicar cómo se debería ordenar, en el models.py:

class Pregunta(models.Model):
    # ...
    def fue_publicada_recientemente(self):
        return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
    fue_publicada_recientemente.admin_order_field = 'pub_date'
    fue_publicada_recientemente.boolean = True
    fue_publicada_recientemente.short_description = 'Publicada recientemente?'

También podemos agregar un sistema de filtros, desde nuestro admin.py:

list_filter = ['pub_date']

Y hasta un sistema de búsquedas:

search_fields = ['texto_pregunta']

Mas personalización del admin?

El listado del administrador ya trae paginado, de 100 items por página. 

Change list paginationsearch boxesfiltersdate-hierarchies, y column-header-ordering funcionan en conjunto como esperas que funcionen.

 

Más detalles y opciones de administración en la documentación oficial del admin de django

Otras personalizaciones del admin

Para cambiar los títulos, desde el urls.py principal:

# -*- coding: utf-8 -*-

from django.conf.urls import patterns, include, url
from django.contrib import admin

...

# Texto para poner al final del <title> de cada página.
admin.site.site_title = u'Administración del sitio cursoweb'

# Texto a poner en los <h1> de todas las páginas.
admin.site.site_header = u'Administrador de Curso Web'

# Texto a poner arriba de la página de index del admin
admin.site.index_title = u'Panel de control de Curso Web'

Incluso más personalizaciones del Admin

Se pueden personalizar las plantillas copiando las originales a nuestra carpeta de plantillas y personalizando esas. Desde el settings.py:

TEMPLATE_DIRS = [os.path.join(BASE_DIR, 'templates')]

Crear esa carpeta (en el raíz del proyecto) y copiar las plantillas originales que se quieran modificar. Para encontrarlas correr:

python -c "
import sys
sys.path = sys.path[1:]
import django
print(django.__path__)"

Las otras plantillas de mi sitio?

  • Django busca por defecto en la carpeta de cada aplicación una carpeta /templates
  • Si no la encuentra, busca en las rutas que hemos indicado en TEMPLATE_DIRS
  • Como ésta es una aplicación simple, pondremos nuestras plantilla en la ruta general de TEMPLATE_DIRS

Personalizando el index del admin

  • El archivo a modificar es admin/index.html
  • Por defecto recorre todas las aplicaciones en INSTALLED_APPS y, de acuerdo a los permisos del usuario, va mostrandolas

Otros admins personalizados

Algunas herramientas útiles

Enlaces útiles

Made with Slides.com