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:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

o inicia sesi贸n.

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 鈥榩icture鈥, agregue 鈥榩icture_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')