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/
En encuestas/admin.py
from django.contrib import admin
from encuestas.models import Pregunta
admin.site.register(Pregunta)
Clickeando en "Preguntas" obtenemos
Clickeando en "Que te pasa?" obtenemos
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)
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)
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)
Agregamos objetos relacionados
from django.contrib import admin
from encuestas.models import Eleccion, Pregunta
# ...
admin.site.register(Eleccion)
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)
Optimizamos el espacio de los objetos relacionados
class EleccionInline(admin.TabularInline):
#...
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')
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']
El listado del administrador ya trae paginado, de 100 items por página.
Change list pagination, search boxes, filters, date-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
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'
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__)"