A煤n no tienes acceso a esta clase

Crea una cuenta y contin煤a viendo este curso

Dashboard de Administraci贸n

17/37
Recursos

Editaremos el detalle para que sea igual de complejo que el detalle de Usuario y le agregaremos los datos del perfil para no tener que estar cambiando de urls. Usaremos fieldsets y admin.StackedInline.

En la documentaci贸n de Django, https://docs.djangoproject.com/en/2.0/ref/contrib/admin/ podemos ver c贸mo funcionan los fieldsets.

Aportes 47

Preguntas 22

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesi贸n.

Es incre铆ble su forma de ense帽ar, la velocidad en la que va es muy c贸moda para mi que ya tenia conocimientos previos, creo que es uno de los mejores profesores que he visto en platzi.

鈥淰aya, tuve un error en el modelo鈥
鈥淣o pasa nada, borro la base de datos y lo vuelvo a hacer鈥

WTF?

Creo que va muy acelerada la forma de explicar las cosas. Est谩 muy por encima pero creo que lo complementa muy bien haciendo referencia todo el tiempo a la documentaci贸n.
La documentaci贸n es el mejor aliado, pero tal vez a alguien que no muy est茅 acostumbrado, tal vez se aturda en la manera de explicar鈥 es solo mi opini贸n.

no entiendo porque ponen tanto sobre esta consola de administracion, quiero ver como hacer las cosas sin ella

Enero 2020

Socumentaci贸n actualizada

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

this can help you to understand and remember it

Yo no conoc铆a Django, pero por m谩s que escucho no entiendo nada鈥 la velocidad con la que dice las cosas es demasiado r谩pida para mi. Creo que solo alguien que ya conoce Django podr铆a seguirle o entender un poco lo que dice鈥 para mi (despu茅s de haber escuchado muchas clases en Platzi) es el peor curso que he escuchado de Platzi鈥 sobre todo considerando que est谩 clase es la iniciaci贸n y luego hay otra que se llama avanzada鈥

En un trabajo tenia que hacer una aplicaci贸n con frontend , un API y ademas un admin, algo que me costo fu茅 el admin, pero con 茅sta herramienta todo se facilita. Excelente framework. Creo que me cambiare al backend con django

Me encanta que vean tanto la documentaci贸n. Aunque a algunos les parezca poco pedag贸gico, es lo que hace un programador gran parte del d铆a (el otro porcentaje est谩 en stackoverflow o alg煤n foro viendo porque fall贸 algo que estaba implementando)鈥 creo que es muy ordenado ir viendo la documentaci贸n e implementar a partir de lo que dicen las mismas instrucciones.
He aprendido mucho, estoy muy feliz

Cuando pongo los campos created o modified de esta forma:

fieldsets = (
        ('Profile',{
            'fields': (('user', 'picture'),),
        }),
        ('Extra_Info',{
            'fields': (
                ('website', 'phone_number'),
                ('biography')
            )
        })
        ('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??```

Datall茅 gracias a los campos created y modified que no correspond铆a la zona horaria, por lo cu谩l se debe modificar en settings.py el campo TIME_ZONE = 鈥楢merica/Bogota鈥 en mi caso.

Veo mucha gente que se queja por el hecho de que el profesor va mucho a la documentaci贸n, explica r谩pido, etc.

Mi aporte: No se puede aprender lo que 茅l aprendi贸 en 5 a帽os en unas horas. Desafortunadamente, esto no es como jugar con ciclos, tipos de datos o librer铆as. Es un framework profesional con una documentaci贸n de 2000 p谩ginas.

Recomendaci贸n: Todo curso deber铆a tener una intro donde se explique el funcionamiento general antes de entrar de lleno al c贸digo.

Creo que soy el 煤nico que le saco jugo al curso en velocidad x2 xD

Para las personas que les parece que el curso va bastante rapido, pueden utilizar el enlace:
https://tutorial.djangogirls.org/es/

Es una comunidad de Django donde explican de forma sencilla muchas cosas del framework, a mi me sirvi贸 mucho.

Excelente, me gusto mucho esta clase. Trabajando en Windows con el Visual Code y ha sido genial. Enamorandome de Django

En la parte en que te equivocaste con el campo biography hubiese sido interesante ver como resolv铆as sin borrar la BD, eso es algo que seguramente a muchos nos pasa

Yo al darme cuenta que despues sigue un curso de Django avanzado.

Espero que ahi no tengamos que borrar la base de datos completa por un typo.

Recomiendo

  1. Ver la clase 2 o 3 veces si recien estan empezando.
  2. Ver la clase en velocidad 0.85x

Una forma de agregar las propiedades que ya existen

class ProfileInline(admin.StackedInline):
    model = Profile
    can_delete = False
    verbose_name = 'Profile'
    verbose_name_plural = 'Profile'

class UserAdmin(BaseUserAdmin):
    inlines = (ProfileInline,)
    list_display = list(BaseUserAdmin.list_display) + ['is_active']

admin.site.unregister(User)
admin.site.register(User, UserAdmin)

驴Los list_display del admin register y los fieldsets se pueden usar si quiero crear los perfiles en una ruta alterna de este admin dashboard? Es decir quiero que el usuario pueda ver y editar su perfil en una secci贸n distinta y privada de mi sitio web.

驴En d贸nde encuentro los archivos del curso ahora? Hace tiempo que no entro a platzi y ahora lo estoy retomando

Al cambiar el nombre del atributo en models.py (biography o cualquier otro), el aplicar makemigrations te pregunta si 茅ste ha cambiado, el aplicar despues migrate, automaticamente hace los cambios hasta en la tabla de base de datos, sin necesidad borrarla.

El user no deberia estar ligado al profile? Me surgio la duda al ver que me salio lo siguiente:

Veo que puedo poner el user y el profile 鈥榗ruzados鈥 y no afecta al programa. As铆 deberia de ser?

Super atorado con las migraciones, despu茅s de eliminar las migraciones y la db trono todo y estuve 1hr revisando que onda. pero pude solucionarlo. reiniciando mi maquina 馃暤!

a pesar de que no eh tomado el path completo de backend con python este profesor hace increible el aprendizaje acerca de django, eh tomado otros cursos de django pero este es por mucho el mejor de todos y el que mas valor aporta sin duda alguna alguien que sepa python ya puede entender sin problemas este curso y explotarlo

Es la primera vez q estoy viendo DJango con Python pero el profe Pablo la verdad ense帽a de donde saca todo me gusta esa relaci贸n de documentaci贸n/codifico de un mismo momento, creo q es la mejor forma de ense帽ar

class ProfileInline(admin.StackedInline), para definir que queremos darle administrador a el profile. Dentro de esta clase, definimos. model = (en nuestro caso Profile), can_delete = False, verbose_name_plural = "profiles"(puede ser otro), luego para heredar al usuario admin, importamos: from django.contrib.auth.admin import UserAdmin as BaseUserAdmin. Para heredar lo necesario, en lo siguiente: class UserAdmin(BaseUserAdmin) en la que ponemos la variable: inlines, que lleva una tupla, con el modelo que queremos integrar. Luego de ello ponemos la variable, list_display, en la que ponemos lo que queremos que sea listado.

Ahora que tenemos la interfaz de la forma que queremos. Es momento de linkear users, que viene por default, con los users de nuestro Profile, para ello, tenemos que quitar User del registro, para luego a帽adirlo, con una clase que contiene lo que nostros queremos.

Para especificar cu谩les son los espacios de solo lectura, o read only en ingl茅s, utilizamos la variable, readonly_fields, en el que espcificamos en una tupla, cu谩les son esos espacios.

Si no categorizamos los campos, desaparecen decoraciones, que hacen aluci贸n a la informaci贸n que representa.

Lo que hacemos dentro de los campos de un registro, al momento de definir el t铆tulo, es generar una lista de filas, si anidamos estas en otra tupla, y luego seguimos agregando, entonces vamos a obtener varios campos subyacentes.

si queremos ver varios elementos en filas, entonces solo tenemos que anidarlos dentro de tuplas.

Siempre asegurarse de que haya comas dentro de las tuplas, sobretodo cu谩ndo esta tiene un solo elemento, debido a que no nos podemos confundir.

Cada tupla de fieldsets, lleva dos elementos, un t铆tulo y luego un diccionario.

Para que se nos muestren los registros de una forma m谩s completa, lo 煤nico que vamos a necesitar es trabajar con la variable, fieldsets, la cu谩l es una tupla de varias dimensiones.

hay que recalcar que nuestros campos a la vista en el administrador, son tuplas que los contienen.

No es necesario borrar la base de datos, solo cambias el error, makemigrations, y luego migrations y ya

El mismo profesor complica las cosas, la verdad que curso tan atorado, explica las cosas como si ya se tuviese idea de lo que habla, se salta muchas cosas y lo 煤nico que si no se le olvida es 鈥榟ay muchas cosas en la documentaci贸n鈥.

Es buen profesor pero creo que le da muchas vueltas al tema, al principio era excelente, pero desde hace unos 3 o 4 videos atr谩s se acelera. voy a volver a repetir, igual la idea es aprender jeje

Existe alguna librer铆a para mostrar el dashboard del 鈥淎dmin鈥 de django para el frontend. Para que se puede interactuar desde los templates y las vistas.

Saludos.

Cuando pongo los campos created o modified de esta forma:

fieldsets = (
        ('Profile',{
            'fields': (('user', 'picture'),),
        }),
        ('Extra_Info',{
            'fields': (
                ('website', 'phone_number'),
                ('biography')
            )
        })
        ('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??```

Me sale el siguiente error:

class ProfileInline(admin.StackedInLine):
AttributeError: module 鈥榙jango.contrib.admin鈥 has no attribute 鈥楽tackedInLine鈥

es en la herencia de ProfileInline


class ProfileInline(admin.StackedInLine):
	"""Profile in-line admin for users."""

	model = Profile
	can_delete = False
	verbose_name_plural = 'profiles'

Excelente profesor!

Corren esta sentencia SQL para enmendar los errores producidos por el typo de 鈥榖igography鈥 sin tener que borrar la DB:

ALTER TABLE users_profile
RENAME COLUMN bigography TO biography;

Funciona desde SQLite

Prefiri贸 hacer todo el proceso con la data nuevamente, crear db, crear datos a solo cambiar el nombre de del campo y hacer makemigrations. 5 minutos perdidos.

Ejemplo de fieldsets


from django.contrib import admin


class FlatPageAdmin(admin.ModelAdmin):
    fieldsets = (
        (None, {
            'fields': ('url', 'title', 'content', 'sites')
        }),
        ('Advanced options', {
            'classes': ('collapse',),
            'fields': ('registration_required', 'template_name'),
        }),
    )

para los que les sirva el canal de pablo trinidad en youtube
https://www.youtube.com/channel/UC-Ol76LwNXj8scU_VtKDxVg

Codigo Actualizado

"""User admin classes"""

#Django
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from django.contrib import admin

# Models
from django.contrib.auth.models import User
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')
    fieldsets = (
        ('Profile', {
            'fields': (
                ('user', 'picture'),),
        }),
        ('Extra info', {
            'fields': (
                ('website', 'phone_number'),
                ('biography'),
            )
        }),
        ('Metadata', {
            'fields': (('created', 'modified'),),
        })
    )

    readonly_fields = ('created', 'modified',)


class ProfileInLine(admin.StackedInline):
    """ Profile in line admin for users"""

    model = Profile
    can_delete = False
    verbose_name_plural = 'profiles'


class UserAdmin(BaseUserAdmin):
    """Add profile admin to base user admin"""

    inlines = (ProfileInLine,)
    list_display = (
        'username',
        'email',
        'first_name',
        'last_name',
        'is_active',
        'is_staff'
    )


admin.site.unregister(User)
admin.site.register(User, UserAdmin)