Usuario:Lmorillas/desarrollo web servidor/django/intro/admin
Contenido
- 1 El poderoso Admin de Django
El poderoso Admin de Django
- El Admin es una herramienta pensada para el "backend", no para el acceso de los usuarios
- Simplifica la tarea de insertar, modificar y eliminar contenido de la web.
Activar el Admin
- Por defecto está desactivado.
- Añade django.contrib.admin a la lista de INSTALLED_APPS en settings.py.
- Ejecuta
$ python manage.py syncdb
- Edita el fichero urls.py de tu proyecto y descomenta las líneas que hacen referencia al admin (3 líneas en total)
El fichero tiene que quedar al final algo así:
from django.conf.urls.defaults import patterns, include, url
# Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
# Examples:
# url(r'^$', 'sitio_encuestas.views.home', name='home'),
# url(r'^sitio_encuestas/', include('sitio_encuestas.foo.urls')),
# Uncomment the admin/doc line below to enable admin documentation:
# url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
# Uncomment the next line to enable the admin:
url(r'^admin/', include(admin.site.urls)),
)
Lanzar Admin
$ python manage.py runserver
$ curl http://127.0.0.1:8000/admin/ -I HTTP/1.0 200 OK Date: Tue, 23 Aug 2011 15:33:25 GMT Server: WSGIServer/0.1 Python/2.7.1+ Last-Modified: Tue, 23 Aug 2011 15:33:25 GMT Expires: Tue, 23 Aug 2011 15:33:25 GMT Content-Type: text/html; charset=utf-8 Vary: Cookie Cache-Control: max-age=0 Set-Cookie: csrftoken=b53bd036b15251d45ed07b15c60e5116; expires=Tue, 21-Aug-2012 15:33:25 GMT; Max-Age=31449600; Path=/ Set-Cookie: sessionid=2d639f8c86e4e380698c1991fec9d848; expires=Tue, 06-Sep-2011 15:33:25 GMT; Max-Age=1209600; Path=/
HTTP/1.0 301 MOVED PERMANENTLY Date: Tue, 23 Aug 2011 15:35:12 GMT Server: WSGIServer/0.1 Python/2.7.1+ Content-Type: text/html; charset=utf-8 Location: http://127.0.0.1:8000/admin/ HTTP/1.0 200 OK Date: Tue, 23 Aug 2011 15:35:12 GMT Server: WSGIServer/0.1 Python/2.7.1+ Last-Modified: Tue, 23 Aug 2011 15:35:12 GMT Expires: Tue, 23 Aug 2011 15:35:12 GMT Content-Type: text/html; charset=utf-8 Vary: Cookie Cache-Control: max-age=0 Set-Cookie: csrftoken=3365df1f4fc610f6d4e9a7ea5f5d97b2; expires=Tue, 21-Aug-2012 15:35:12 GMT; Max-Age=31449600; Path=/ Set-Cookie: sessionid=1206648ff52d951049b0d830e66a12d9; expires=Tue, 06-Sep-2011 15:35:12 GMT; Max-Age=1209600; Path=/
Puedes probar la dirección en el navegador: http://127.0.0.1:8000/admin/
Usuarios
Tendrás que entrar con el superurser que creaste la hacer syncdb. Si no recuerdas, puedes crear otro superusuario:
$ python manage.py createsuperuser
Hacer el proyecto modificable por el Admin
La aplicación Encuestas no aparece. Hay que activarla dentro del admin:
- Crea un fichero admin.py dentro de la aplicación encuestas con este contenido:
from encuestas.models import Encuesta
from django.contrib import admin
admin.site.register(Encuesta)
- Reinicia el servidor de desarrollo. El servidor no detecta la creación de un nuevo archivo.
Se ha creado un completo entorno CRUD para nuestras encuestas:
- Se genera un formulario automático para el modelo
- Incluye validación de campos
Configuración del formulario
La configuración se hace mediante el archivo admin.py creado.
- Preparamos una clase especial para las encuestas (EncuestaAdmin)
- Indicamos a admin que use esa clase para gestionar nuestro modelo
admin.site.register(Encuesta, EncuestaAdmin)
Vamos a cambiar el orden en que aparecen los datos:
# -*-coding: utf-8 -*-
from encuestas.models import Encuesta
from django.contrib import admin
class EncuestaAdmin(admin.ModelAdmin):
fieldsets = [
(None, {'fields': ['pregunta']}),
('Publicación', {'fields': ['fecha_pub']}),
]
admin.site.register(Encuesta, EncuestaAdmin)
Se pueden asignar clases html a cada fielset para personalizar la prsentación. Django ofrece una clase collapse que muestra el fielset sin expandir por defecto. Útil cuando hay que distribuir muchos contenidos.
class PollAdmin(admin.ModelAdmin):
fieldsets = [ (None, {'fields': ['question']}), ('Date information', {'fields': ['pub_date'], 'classes': ['collapse']}), ]
Añadir objetos relacionados
Nuestro Admin todavía no muestra las opciones para las encuestas. Tenemos dos opciones:
- Registrar Opcion con el admin como hemos hecho con las Encuestas
from polls.models import Choice admin.site.register(Choice)
- Admin crea de forma automática un <select> box para la clave foránea, que incluye todas las encuestas de la base de datos.
- Podemos crear las Opciones desde la misma encuesta.
from encuestas.models import Encuesta, Opcion
from django.contrib import admin
class OpcionInline(admin.TabularInline):
model = Opcion
extra = 3
class EncuestaAdmin(admin.ModelAdmin):
fieldsets = [
(None, {'fields': ['pregunta']}),
('Publicación', {'fields': ['fecha_pub'], 'classes': ['collapse']}),
]
inlines = [OpcionInline]
admin.site.register(Encuesta, EncuestaAdmin)
Con el inline indicamos a Django que los objetos Opcion se editan en la página de administración de Encuestas y que por defecto añade los campos suficientes para añadir 3 Opciones más.
Admin ofrece dos tipos de inlines: StackedInline y TabularInline.
Modificar la página de listados
La página inicial muestra el listado de todas las Encuestas del sistema. Por defecto Django muestra el str() de cada objeto. Pero es más usable mostrar campos individuales. Useremos la opción list_display, que es una tupla de nombres de campos (también podemos añadir los métodos creados).
class EncuestaAdmin(admin.ModelAdmin):
# ...
list_display = ('pregunta', 'fecha_pub', 'publicada_hoy')
Podemos especificar el nombre de la columna:
def publicada_hoy(self):
return self.fecha_pub.date() == datetime.date.today()
publicada_hoy.short_description = '¿Publicada hoy?'
Modificar nombre
En los modelos:
verbose_name = verbose_name_plural =
was_published_recently.admin_order_field = 'pub_date' was_published_recently.boolean = True was_published_recently.short_description = 'Published recently?'
Filtros
Añade a EncuestaAdmin
list_filter = ['fecha_pub']
Añade una columna de filtro que permite filtrar los listados por el campo de fecha de publicación. El filtro se muestra según el tipo del campo de filtrado.
Búsqueda
search_fields = ['pregunta']
Añade una caja de búsqueda en la parte superior de los listados. Usa LIKE en las búsquedas.
Fechas
Como las encuestas tienen un campo con fechas podemos facilitar la navegación cronológica:
date_hierarchy = 'fecha_pub'
Paginación
list_per_page = 100
Personalizar la presentación
No tiene sentido ver "Django administration" en la parte superior de las páginas.
Es fácil cambiar usando el sistema de plantillas de Django:
- Configura TEMPLATE_DIRS (tupla de rutas donde busca plantillas Django) en el fichero settings.py.
TEMPLATE_DIRS = ( "/home/my_username/mytemplates", # configura la ruta: rutas absolutas. )
- Copia la plantilla admin/base_site.html' del directorio de plantillas de Django(django/contrib/admin/templates) a un directorio admin dentro de una de las rutas que has configurado en el paso anterior. Por ejemplo, si la ruta era /home/mi_usuario/sitio_encuestas/plantillas, habrá que copiar la plantilla como /home/my_username/sitio_encuestas/plantillas/admin/base_site.html
- Edita la plantilla. La pantilla tiene textos como {% block branding %} y {{ title }} Esas etiquetas {% y {{ son parte del elenguaje de plantillas de Django.
Configurar la página índice
Por defecto aparecen todas las aplicaciones de INSTALLED_APPS por orden alfabético. Para eso hay que cambiar la plantilla admin/index.html. En lugar de usar la variable app_list, puedes forzar las aplicaciones como quieras.