No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Explorando el dashboard de administración

16/37
Recursos

Registraremos el perfil que acabamos de customizar, junto con el modelo extendido de Usuario, en el admin de Django para poder manejarlo desde la aplicación.
Esto puede hacerse de dos formas: con admin.site.register(Profile) o creando una nueva clase que herede de Admin.ModelAdmin.

Aportes 39

Preguntas 14

Ordenar por:

Los aportes, preguntas y respuestas son vitales para aprender en comunidad. Regístrate o inicia sesión para participar.

Aquí la documentacion para admin site y register decorator

https://docs.djangoproject.com/en/2.2/ref/contrib/admin/

Para que el verbose_name se visualice en el admin tienes que especificar donde esta la configuración de la app.
users/init.py

default_app_config = 'users.apps.UsersConfig'

How to solve this kind of error:

Exception Value:	no such table: main.auth_user__old
  • keep django version 2.1.5 (the issue addressed in this version) pip install django==2.1.5
  • Delete the SQLite db
  • Migrate again python manage .py makemigrations and then python manage .py migrate
  • Start the server python manage .py runserver

Mis apuntes de esta clase:
Una vez hayamos creado nuestro user model.
Para que este sea visible desde Django administration. Debe existir lo siguiente:

# Django:
from django.contrib import admin

# Models:
from users.models import Profile

# Register your models here.
admin.site.register(Profile)

Ahora en cuanto abramos nuestro dashboard saldrá nuestro user model.

Podemos personalizar aún más nuestro dashboard. Para ello Django nos ofrece diversas varibales a través de las cuales podemos modificar la vista o incluso añadir funcionalidad a nuestro dashboard.

# Django:
from django.contrib import admin

# Models:
from users.models import Profile

# Register your models here.
@admin.register(Profile)
class ProfileAdmin(admin.ModelAdmin):

    # Variable con los campos a mostrar en el dashboard.
    list_display = (
        'pk',
        'user',
        'phone_number',
        'website',
        'picture',
    )

    # Variable con los campos que serán links.
    list_display_links = (
        'pk',
        'user',
    )

    # Variable con los campos editables desde dashboard| Nota: No puede haber campos link y editables a la vez.
    list_editable = (
        'phone_number',
        'website',
        'picture',
    )

    # Variable con los campos por los que podemos realizar una busqueda.
    search_fields = (
        'user__username',
        'user__email',
        'user__first_name',
        'user__last_name',
        'phone_number',
    )

    # Variable que añade un campo por el cual filtrar los datos.
    list_filter = (
        'created',
        'modified',
        'user__is_active',
        'user__is_staff',
    )

¿Por que al decalarar search_fields todos se escriben poniendo user__ antes de declararlos y para phone_number no es necesario? (de hecho user__phone_number arroja un error)

Lo bueno del dashboard del admin de django es que es responsive. Jajajaja

Llevo algunos días tratando de resolver un problema.
Cuando hago login en el dashboard de admnistración la aplicación deja de funcionar y se detiene todo, intente borrar migraciones, incluso cambiar el gestor de BD a MySQL pero no funciona hasta crear un proyecto de cero y probar el dashboard pero sigue igual.

OneToOneField, se refiere, a que solo un usuario va tener un perfil y un solo perfil, y que un perfil solo va a tener un usuario. Casi como una llave primaria compuesta.

El modelo proxy de Django, es muy interesante, en el que podemos definir la no repetición de los registros y que estos sean únicos.

Cuando iba a agregar el list_filter, solo queria filtrar por la fecha creada

list_filter = ('created')

pero me salio un error que necesitaba una lista, luego recorde una vez que alguien habia dicho que el definidor de las lista no son los parentesis sino las comas y me funciono esribiendo asi

list_filter = ('created',)

Cuando pongo los campos created o modified de esta forma:

fieldsets = (
        ('Profile',{
            'fields': (('user', 'picture'),),
        }),
        ('Extra_Info',{
            'fields': (
                ('website', 'phone_number'),
                ('biography', 'created', 'modified')
            )
        })
        ('Metadata',{
            'fields': (('created', 'modified'),),   
         
        })
    )

Me indica que created y modified no son callable. Pero si los meto en Extra info, por ejemplo, me los toma perfecto. Alguien podr[a ayudarme para entender donde esta el problema??```



estoy haciendo igual a como vengo viendo en el tutorial pero se me presento este problema cuando intento acceder al profile


aqui mi codigo de mi model:

"""Users models."""

# Django
from django.contrib.auth.models import User
from django.db import models


class Profile(models.Model):
    """Profile model.

    Proxy model that extends the base data with other
    information.
    """

    user = models.OneToOneField(User, on_delete=models.CASCADE)

    website = models.URLField(max_length=200, blank=True)
    bigoraphy = models.TextField(blank=True, )
    phone_number = models.CharField(max_length=20, blank=True)

    picture = models.ImageField(
        upload_to='users/pictures',
        blank=True,
        null=True
    )

    created = models.DateTimeField(auto_now_add=True)
    modified = models.DateTimeField(auto_now=True)

    def __str__(self):
        #  Return username.
        return self.user.username 

Excelente, me gustó eso de personalizar el admin de django, tengo algunas modelos creados todo lo mostraba en el str, sin poder hacer búsquedas o filtros y menos ver más información de cada registro!

list_display
list_display_links
list_editable
search_fields
list_filter

#Paginación y máximo de registros devueltos.
list_per_page
list_max_show_all

Para quienes quieran que en el admin se vea también las imágenes de una forma bonita… en el archivo models, el modelo profile, agregue:

from django.utils.html import format_html


def picture_data(self):
        return format_html('<img src="{}" width="100px" />',self.picture.url)

Luego, en el archivo admin clase ProfileAdmin, en vez de agregar ‘picture’, agregue ‘picture_data’ y …

Personalizar dashboard de Admin

Django tambien nos provee la posibilidad de mostrar un valor del modelo relacionado. Por ejemplo supongamos que tambien queremos añadir el correo del usuario a la tabla de profile, lo que tendríamos que hacer es:

from django.contrib.admin import display

list_display = ('user','phone_number','user_email','picture','website')
@display(description='Email')
def user_email(self, obj):
    return obj.user.email

El decorador @display nos permite acceder a esa relación

El orden por el que se ordenan las opciones para filtrar, son las opciones que tenemos definido en el lista.

También podemos agregar filtros, como en los que aparecen en la parte derecha, con list_filter, con los que podemos filtrar.

Si quieres tener cualquier campo a la vista, antes de ser editable, también tiene que estar en la variable, list_display.

El problema aquí es que los campos que estén en la lista de links, no pueden estar en la lista de editables.

Si queremos editar registros en el propio listado, tenemos que especificar esto a través de la variable list_editable.

Podemos definir, que partes del listado, también nos llevan al perfil, con el list_display_links y especificamos los campos que queremos.

Para definir que se muestra, solo necesitamo definir la variable list_display

Ponemos el decorador @admin.register(Nombre del modelo) para extender el modelo.

admin.site.register(Profile), es una forma de extender nuestro modelo y agregarlo al panel. Sin embargo, en este caso, se queda corto en funcionalidades.

Por convención, se le agrega la palabra admin, al final de nuestras clases (En el archivo admin), para extender el modelo. Algo como: ProfileAdmin.

Para extender efectivamente nuestro modelo de usuario.Tenemos que crear en el archivo admin.py de nuestra aplicación, en dónde alberguemos el modelo que queremos extender.

me sales este error por favor una ayuda

django.db.utils.OperationalError: no such table: main.auth_user__old```


Les dejo el código de la clase de profile del admin

from django.contrib import admin
from users.models import Profile

# Register your models here.

@admin.register(Profile)
class ProfileAdmin(admin.ModelAdmin):
    
    list_display = ('pk', 'user', 'phone_number', 'website', 'picture')
    list_display_links = ('pk', 'user')
    list_editable = ('phone_number', 'website', 'picture')
    search_fields = ('user__email', 'user__first_name', 'user__last_name', 'phone_number')

    list_filter = ('created', 'modified', 'user__is_active', 'user__is_staff')```

This can be useful to understand

uff si es completo, pero creo que practicando cada vez se nos hará más fácil!

No me está funcionando la variable list_display de la clase ProfileAdmin en admin.py de la app users. No me refrescan los titulos cuando los cambio y tampoco me tira ningun error. Alguna idea?

Dónde puedo buscar más documentación de lo que se puede hacer en el admin de Django? él ponía list_display, list_display_links, list_editable, etc etc. Dónde puedo encontrar todas las opciones?

Alguien sabe porque cuando intento abrir la imagen desde el sitio de admin de django me sale esto?

Esto lo puedo extender a los posts, o si tengo un e-commerce lo puedo extender a los productos. Esto si es genial. Cuanto trabajo nos hemos ahorrado. Está el admin y el API.

Que importante es poder leer y entender la documentacion con este framework, no me habia pasado con nada hasta ahora al nivel que me pasa con django.

Este curso la verdad esta muy malo de imagen y de sonido deberian renovar este curso.

¿donde encuentro todas essas variables de list…?

Mi codigo

"""User admin classes"""

#Django
from django.contrib import admin

# Models
from users.models import Profile

@admin.register(Profile)
class ProfileAdmin(admin.ModelAdmin):
    """Profile admin. """
    list_display = ('pk', 'user', 'phone_number', 'website', 'picture')
    list_display_links = ('pk', 'user')
    list_editable = ('phone_number', 'website', 'picture')
    search_fields = ('user__email', 'user__first_name', 'user__last_name', 'user__phone_number')
    list_filter = ('created', 'modified', 'user__is_active', 'user__is_staff')