Transcripciones
1. Bienvenido a Django 101: Hola y bienvenidos a Django 101. En este curso, vamos a empezar con Django, tres firmas rayadas para que no necesites ninguna experiencia en absoluto. Estás sin embargo, vas a querer conocer un poco de
clases de Python y Python con el fin de sacar el máximo provecho de este curso y sacar el máximo provecho de Django en este curso, realidad
puedes ver el proyecto detrás de mí. Vamos a crear un proyecto de carga de imágenes. Se parece mucho a Instagram. Simplemente se ve un poco diferente y divertido hecho, Instagram fue construido usando Django. Y en este curso te voy a enseñar exactamente cómo puedes subir imágenes igual que Instagram y compartirlas en una lo que se llama vista de detalle. Al igual que Instagram. Hola, soy Caleb tolueno. Y llevo leyendo a Django desde hace varios años. Yo rastrillé a Django para todos mis proyectos. Creo que es el mejor marco por ahí. A mí me apasiona mucho Django, y estoy muy emocionado de enseñarte a escribir Django. Django está construido sobre Python, que es uno de los lenguajes de programación más populares en el mundo. Es increíblemente poderoso. Y hoy vamos a estar construyendo este proyecto. Bienvenidos a mi clase y espero verte dentro.
2. Uso de un entorno virtual: Muy bien, bienvenido a Django 101. Ante cualquier cosa necesitamos crear un entorno virtual. Siempre hacemos esto cuando estamos trabajando con Django o realmente cualquier proyecto. Entonces para poder escribir Django, debes conocer un poco de Python. Si no conoces a Python, probablemente no tengas un editor de texto. Entonces frente a mí, lo que ven aquí es el código VS. Este es mi editor de texto. A la izquierda va a estar mi carpeta, y al fondo va a estar mi terminal. Entonces si voy a View y luego terminal, y el fondo va a ser mi terminal. Y así vamos a crear un entorno virtual y otros. Una plétora de diferentes formas en que podemos crear un entorno virtual. Podemos usar Vagrant, podemos usar docker, wrapper virtualenv, un Python Vn vía evento, o podemos usar Pip env. Y en este módulo te voy a mostrar cómo podemos hacerlo con envidia de pip. Entonces lo primero es lo primero, probablemente ya tengas Python instalado. Deberías poder hacer Python dash v. estaré usando Python 3.8. Si eso te funciona, entonces
puedes escribir pip install PIP. Y ahora ya tengo instalado Pip env. Entonces esto va a ser realmente, muy rápido. Esto podría ser un poco más lento para ti, pero eventualmente eso debería instalarse. Y luego podemos teclear pip instalar Django. Y esto va a crear un nuevo entorno PIP para nosotros. Y sólo le damos a eso un rápido segundo para instalar Django para nosotros. Y esto va a instalar Django 3.1. Veremos la versión exacta en tan solo un segundo cuando esto se haga. De acuerdo, ahora que eso está hecho, podemos hacer pip N shell para meternos dentro de nuestro entorno Pippin y hacer pip show Django. Y estoy usando Django versión 3.1.1 por ahora para salir de nuestro shell, todo lo que tenemos que hacer es escribir Control D o salir y eso nos va a salir. Y para volver a entrar, simplemente escribimos Pip nth shell. Y si echamos un vistazo a nuestros archivos aquí, ls dash LA, o si estás en Windows DIR, nos
va a dar un archivo Pip y un archivo Pip dot loc. Ahora en este momento, si tienes instalado Git, puedes hacer git init, git, add, git commit. Número uno, configurar un Pip env. Y luego si hacemos este comando de fantasía real, que es un log de git de lujo, puedes ver que nuestro primer compromiso aquí
configurando un PIP y si no estás usando el bien, está bien. Simplemente puedes ignorar esa parte de este video. Voy a estar usando get moving forward. Pero de nuevo, si no estás usando el bien, si estás usando un sistema de control de versiones diferente, Eso es totalmente genial, puedes simplemente ignorar esa parte. En el siguiente video. Vamos a seguir adelante y en realidad conseguir la configuración de Django.
3. Configuración de Django: De acuerdo, sigamos adelante y consigamos la configuración de Django. Entonces lo primero es que tenemos que hacer es que necesitamos meternos dentro de nuestros entornos virtuales. Ahora estoy usando Pip env. Puedes usar Venn, Docker, vagabundo, cualquier capa de abstracción que quieras. Es bueno tener algún tipo de entorno virtual aquí. Si hacemos Pip show Django, deberíamos poder ver que tenemos a Django ahí dentro. Si no tienes a Django ahí dentro, siempre
puedes hacer pip install. Django es igual a, igual a 3.1.4 o lo que sea la versión más reciente de Django. Y eso instalará Django para ti. A continuación podemos escribir Django dash admin, iniciar proyecto, y lo voy a llamar mi sitio. Y luego escribo punto. Y eso sólo lo va a poner justo en esta carpeta exacta. Entonces echemos un vistazo a dónde estamos al principio. Estoy en mi escritorio en una carpeta llamada Django 101. Podemos ver que a la izquierda aquí, Django 101. Y así simplemente quiero escribir Django Admin, empezar a proyectar mi sitio. Y si no lo das, el punto va a crear una sub carpeta aquí llamada mi sitio, que puede o no ser lo que quieras. No quiero eso. Yo solo quiero que Django cree un nuevo proyecto en este directorio en el que estoy. Ahora si hago ls dash l a, o si estás en Windows, Windows puedes escribir D-I-R dir. Y vamos a ver que ahora hemos manejado dot py y mi sitio. Y si abrimos esto a la izquierda, tenemos todo tipo de cosas aquí. Hemos gestionado el archivo a.py batiendo ajustes de URL como e y en init dot pi. Ahora lo que podemos hacer aquí es que podemos, si solo despejo esto, tipo D JAR, Django run server. Por lo que escribimos python administrar dot py run server en 0.0.0 puerto 8 mil. Y esto debería decir que sin embargo tenemos unas migraciones aplicadas. Ahora lo que es una migración es simplemente conectarse a una base de datos de algún tipo. Entonces sé que se está conectando a una base de datos SQLite tres aquí. Es solo un archivo sencillo y está tratando de aprovisionar mi base que
podamos configurar usuarios y permisos y todo tipo de cosas. Y siempre que veas este poco rojo y no es realmente un error, es más un mensaje que dice, oye, tienes 18 sobre migraciones aplicadas. Simplemente puedes escribir Python administrado up pi migrate. Y lo que esto va a hacer es decirle a Python cualquier versión de python que estés usando para ejecutar gestionado en pi y su parámetro o argumento en la línea de comandos es solo el trabajo migrar. Y así ejecutamos eso y vamos a ver que ahora todos estos están corriendo. Y luego para volver a ejecutar un servidor, solo
tengo el atajo a coma d j, r porque yo, ejecuto este comando cientos de veces al día. Por lo que Python administró servidor de alta ejecución 0.0.0 punto 0 colon 8 mil. Y deberíamos ver esto. Ahora en este punto del tiempo. Si ven esto, ahora podemos abrir nuestro navegador y podemos dirigirnos al puerto localhost 8 mil. Por lo que sólo escribimos localhost colon ocho mil. Ocho mil partidos con lo que escribimos en nuestra línea de comando. Y deberíamos ver esto. Una vez que veas esto, ahora
tienes un proyecto de Django funcionando y funcionando con éxito. Ahora esto está bien, pero aquí no hay nada. Entonces sigamos adelante y revisemos la admisión. Podemos está ahí un enlace admin aquí abajo, Documentación, tutorial, comunidad Django. Aquí no hay admin. Por lo que podemos ir directamente a slash Admin y necesitamos un nombre de usuario y contraseña. Entonces sigamos adelante y configuremos un nombre de usuario y contraseña, tunelizados de nuevo a nuestra terminal aquí. Y podemos escribir Python administrado dot py, crear super usuario. Y todo lo que hice ahí, por cierto, cuando estaba ejecutando el servidor fue que acabo de golpear el Control C para cancelar. Entonces voy a crear un nuevo superusuario. Voy a llamarlo Caleb. No hay respuesta. Agregar Caleb dot IO. Voy a darle una contraseña, reescribiste mi contraseña. Y fresco. Superusuario creó con éxito esa es nuestra cuenta de administrador. Y entonces simplemente ejecutamos Python administrado up.py ejecutar servidor es 0000 colon 8 mil otra vez. Vuelve a nuestro navegador, refresca. Tan solo asegúrate de que esta página realmente cargue la forma en que estamos esperando que se cargue. Escriba nuestro nombre de usuario y contraseña. Y voila, estamos dentro de nuestro Django Admin. Aquí es donde vamos a estar editando todo nuestro contenido. Podemos manejar prácticamente todo por aquí, siempre y cuando le digamos a Django que se supone que es manejable por un administrador. Por lo que tu tarea para esta lección es instalar Django dentro de tu entorno virtual y crear un superusuario. Y no te olvides de dirigir tus migraciones. Y una vez que veas esta página y también esta página, estás listo para pasar a la siguiente lección.
4. Crea una nueva aplicación: De acuerdo, sigamos adelante y creemos nuestra primera app. Y así Django hace esta cosa graciosa donde en realidad no sé por qué les llaman apps. Es un poco confuso porque no estamos creando una aplicación telefónica o una aplicación móvil, pero es como una pequeña mini aplicación dentro de nuestra aplicación Django, y así les llamamos apps. Y así lo que podemos hacer aquí es crear una nueva app usando un comando que Django nos da. Entonces hacemos Python administrar dot pi, y estoy justo dentro de mi entorno virtual aquí. Python gestionó dot py, start app, y voy a llamar a este feed. Y si miras a la izquierda, solo dale un segundo rápido. Crea una carpeta llamada feed. Cuenta con migraciones y aplicaciones de admin knit modelos hasta alto test.py y vistas dot pi. Ahora lo que queremos hacer es activar esto. Y para poder activar esto, lo que tenemos que hacer es ir a mi sitio, entrar en nuestro settings.js y nos hace apenas un poquito más pequeños aquí. Y lo que buscamos son aplicaciones instaladas. Y aquí vemos que instalamos aplicaciones. Django, contrario a los tipos de contenido admin, auth, sesiones, mensajes, y archivos estáticos, estas son todas las cosas que simplemente vienen con, con Django. No necesitamos preocuparnos por lo que son ahora mismo ya que este es solo un curso de Django 101. Entonces esta es una lista, una lista de Python, y simplemente voy a escribir el nombre de esta carpeta aquí. Se llama alimentación. Y sigamos adelante y ejecutemos nuestro servidor una vez más. Y vemos que no pasa nada. Si vemos que no pasa nada, esta es una buena noticia. Esto probablemente significa que has instalado correctamente tu feed. Eso es todo lo que hay para este video, ojalá estés siguiendo, no lo olvides, y necesitas ejecutar Python app de inicio alto administrado, no iniciar proyecto, sino iniciar app. Y luego el nombre de tu app y eso va a crear una nueva carpeta para ti. Y luego ingresas a tu configuración, instalas aplicaciones e instalas esa app. Simplemente ponlo en la parte inferior de tu lista de aplicaciones instaladas.
5. Tu primer modelo de Django: De acuerdo, sigamos adelante y creemos un nuevo modelo. Y así lo que se supone que hace un modelo
no sólo genera automáticamente una tabla en nuestra base de datos para nosotros. Por lo que Django es muy agradable en el sentido de que no tenemos que administrar nuestra base de datos prácticamente en absoluto. Eso lo hace automáticamente a través de la forma de migraciones y modelos. Y así un modelo es simplemente una forma de escribir código en forma de una clase de Python. Y se va a mapear automáticamente a una base de datos que ni siquiera podemos ver. Y luego podemos ir a modificar algunos de esos datos. Entonces en esta lección, lo que quiero hacer es crear un nuevo modelo en nuestro feed que acaba de llamar posts. Entonces lo vamos a activar en nuestro administrador de Django para que podamos verlo. Entonces voy a dejar de correr a Django. No es que no fuera que fuera perjudicial mientras funcionaba. No hay problema para mantenerlo en funcionamiento. De hecho, les mostraré que puede seguir funcionando mientras estamos haciendo esto. Entonces vamos a abrir los modelos de feed dot py, y dice crear aquí tus modelos. Adelante y borremos ese comentario. Y vamos a escribir clase Post modelos, modelo punto. Y lo que esto hace automáticamente es si le dijéramos a Django, Hey, buscar nuevos cambios llamados Migraciones, entonces
va a generar un archivo de migración y luego aprovisionar nuestra base de datos para que tenga una tabla llamada feed underscore post. Y eso solo nos permite crear una forma sencilla de almacenar datos. Ahora en este post, vamos a empezar muy sencillo. Vamos a empezar con un texto básico. Y así aquí decimos texto como propiedad es igual a dos modelos, campo char
punto, y esto es sólo un campo de caracteres. Se necesita una longitud máxima. Y creo que el maxlength suele estar en algún lugar alrededor de 256 caracteres. Pero hagamos esto como un tuit original, como un 140 personajes. Entonces a menudo vas a ver una palabra clave más aquí llamada en blanco en que puede ser verdadera o falsa. Por defecto, el espacio en blanco es falso. Y lo que eso significa es cuando estamos llenando un formulario, ¿es necesario llenar este campo? Absolutamente. Sí, tiene que llenarse. Vamos a decir que esto es obligatorio. Y entonces tenemos otra opción aquí llamada null. Y nulo puede ser verdadero o nulo puede ser falso. Y cuando null es cierto, eso significa que nuestra base de datos puede almacenar ya sea sin valor y cadena vacía o algún tipo de cadena. No queremos que esto sea nulo es igual a verdadero, ser cierto. Porque siempre queremos que esto se llene en nuestra base de datos. Por lo que siempre va a haber texto. No puede estar en blanco, no puede ser texto vacío. Siempre tiene que estar ahí. Entonces digamos que null es igual a falso. Ahora sigamos adelante y guardemos esto. Y ves que Django se reinicia automáticamente para mí aquí. Lo que puedo hacer ahora es hacer una migración. Entonces lo hago Python manejo de punto py, hago migraciones. Y esto va a crear un archivo totalmente nuevo. Y puedes ver aquí, creó 0001 puntos iniciales py. Y todo esto hace es crear un archivo python que ahora sea ejecutable. Y cuando ejecutamos Python administrado dot py migrate, no tiene dependencias. Es la primera y tiene algunas operaciones aquí dentro. Se va a crear un modelo o crear una tabla en nuestra base de datos llamada post. Y estos son los campos que tiene un ID automáticamente, por lo que un ID de campo automático único. Todo modelo viene con esto. Y el que le dimos es texto. Por lo que ahora tenemos una tabla que podemos agregar a nuestra base de datos con dos columnas en ella. Y sigamos adelante y ejecutemos Python administrado dot py migrate. Y esto va a aplicar esa migración. Y ahora no vemos que pase nada a estas alturas del tiempo. Todo lo que vemos es que aplicar el feed 001 inicial estaba bien. Eso es todo lo que necesitamos saber. Eso se trata de tanto manejo de bases de datos como vamos a meternos en Django 101. Entonces vamos a volver a ejecutarlo Django run server. Y cuando volvamos a nuestro navegador aquí en nuestro admin, no
vamos a ver nada. Y eso se debe a que por defecto, esta tabla existe. Pero simplemente no es manejable todavía. Por lo que necesitamos que esto sea manejable. Por lo que creamos un modelo que se mapea a una tabla. Les hicimos migraciones. Ahora necesitamos entrar en feed admin dot py, y necesitamos registrar nuestro modelo aquí. Entonces vamos a seguir adelante y deshacernos de este comentario. Y esto se va a quedar como esta clase. Post admin o como quieras llamarlo, admin, dot Modelo. Admin. Y admin apenas viene de aquí. Simplemente podemos pasar. No queremos hacer nada. Podemos dar un parámetros extra, características extra. Podemos habilitar todo tipo de características. No vamos a hacer nada de eso ahora mismo. Nosotros sólo queremos que sea simplemente editable. Entonces decimos admin, dot site, DOT register, post y post admin. Y así lo que esto va a hacer es conectar post con post Admin. Ahora post aún no se importa. Tenemos que importar eso para que podamos decir desde y porque esto está en la misma carpeta, admin y modelos están en la misma carpeta. Simplemente podemos decir modelos de punto, importación post. Y cuando nos registramos aquí, es decir Connect post with this post Admin, que va a heredar todo desde admin dot Model admin. Sigamos adelante y guardemos eso. Django se reinicia. Y vamos a refrescar aquí nuestro administrador de Django. Y de nuevo, una vez más, sólo soy ese puerto localhost 8 mil slash Admin. Y ahora tengo en mi feed app posts y podemos seguir adelante y crear un nuevo post. Este es mi primer post. Guardar. Ahora si miras esto, este es post objeto en Django. Cada vez que accedemos a una pieza de datos o a una fila en nuestra base de datos, se llama objeto. Y así queremos cambiar este nombre de objeto porque siempre solo dice el nombre del objeto modelo uno, objeto a objeto tres. No sabemos cómo identificar eso. Adelante y hagámoslo identificable. Entonces en nuestros modelos dot pi aquí, podemos decir def subrayado, cadena de subrayado. Esta es una clase siempre toma auto como su primer parámetro. Y luego vamos a decir volver autof.age. Y cualquiera que sea este post va a ser, así es como ahora se va a llamar este objeto. Por lo que Django se reinicia. Vamos a refrescar esta página y vamos a ver que esto aparece con mi texto real aquí. Por lo que le hemos dado un nombre a este objeto, y esto solo es bueno para el administrador cuando estás depurando cosas o agregando contenido a través de tu admin. Podemos hacer click en él. Podemos cambiarlo, actualizarlo, guardar y seguir editando. Podríamos borrarlo si quisiéramos. Adelante. Sí, seguro que borra este post. Vamos a añadir otro. Este es un nuevo post. Guardar. Ahora, aquí está la cosa. Mucha gente piensa que sólo porque creamos este, este objeto, que debería aparecer en nuestra página, y eso simplemente no es cierto. Todo lo que hicimos fue crear una pieza de datos en nuestra base de datos o aprovisionamos una tabla en nuestra base de datos. Agregamos una fila a esa tabla. Entonces piénsalo como una hoja de cálculo. Tenemos esta hoja de cálculo gigante, y esa es nuestra nueva mesa. Y luego tenemos dos columnas ahí dentro. En nuestra pequeña hoja de cálculo metafórica aquí tenemos dos columnas. Tenemos una llamada ID y otra llamada texto. Este es un campo entero. Y éste es un campo de texto o un campo char, un campo de caracteres. Por lo que no puede tener 10 mil personajes, pero puede tener un 140 caracteres. Y a eso lo llamamos un campo char o un campo de caracteres. Pero donde la gente se vuelve un poco confusa, no aparece aquí. Y eso es porque simplemente no sabe cómo queremos que se presente. ¿ Cómo queremos darle estilo a nuestra página web? ¿ Dónde queremos colocar las cosas? Ningún marco en el mundo te puede decir que no se va a saber automáticamente. Necesitas decirle explícitamente qué hacer. Entonces en nuestra siguiente lección, sigamos adelante y sumemos nuestra primera vista y actualicemos un poco esto.
6. Tu primera vista: Muy bien, necesitamos sumar nuestra primera vista y esto está un poco involucrado. Y una vez que lo configuramos, es realmente agradable de usar. Pero para empezar, puede ser un poco complicado. Por lo que nuestro sitio viene con este archivo, no este, ese es el equivocado. Urls dot pi m Podemos leer a través de esto. Definitivamente recomendaría leer a través de eso. No voy a leer eso para ti sólo porque eso es obviamente una pérdida de tu tiempo. Y luego tenemos estas cosas llamadas patrones de URL. Y los patrones de URL van a coincidir con algún tipo de ruta a algún tipo de lógica. Y para nosotros, eso resulta en localhost puerto 8 mil slash Admin. Ahora podemos cambiar ese admin si quisiéramos, cambiándolo a mi admin o literalmente cualquier otra cosa que queramos. Voy a mantenerlo como administrador sólo por el bien de mantener las cosas simples. Pero ahora digamos que queremos añadir una nueva página de inicio. Tenemos que sobrescribir el que nos dio jangle y Django nos dio éste aquí mismo. Ya no queremos esto. Es bonito. No me malinterpreten, pero queríamos ver otra cosa. Queremos hacer de esta nuestra propia aplicación. Ahora, nuestra aplicación se va a quedar realmente fea y luego vamos a hacer que se vea realmente bonita. Entonces vamos a trabajar primero en el back-end y luego vamos a sumar el front end más tarde. Por lo que necesitamos agregar algunas URL aquí. Ahora realmente no importa por dónde empecemos. Tenemos que hacer un montón de cosas al mismo tiempo. Entonces lo que voy a hacer es en esta carpeta de aquí, voy a crear un nuevo archivo llamado URLs dot py. Y eso sólo va a vivir al lado de mis modelos arriba y mi admin dot py. Ahora aquí dentro vamos a estar haciendo algunas cosas diferentes. Entonces, antes que nada, sigamos adelante y digamos desde Django, puntos URL, importar un camino. Y lo vimos en el archivo anterior, ruta de importación de
Django URL, y queremos usar algo como esto. Ahora vamos a crear nuestros propios patrones de URL, y esto es simplemente una lista de rutas. Vamos a seguir adelante y también darle a esto un nombre de aplicación y esto se va a utilizar para el espaciado de nombres hablará qué espacio de nombres y poco más adelante. Pero por ahora, vamos sólo, vamos a ir con ello. Vamos a darle a esto un nombre de aplicación llamado feed. Entonces le vamos a dar patrones de URL es igual a una lista. Y esto va a tomar un camino. Y solo queremos la página de inicio. Entonces le vamos a dar un camino vacío. Y esto va a tener sentido en tan sólo un segundo. Entonces necesita renderizar alguna vista. Y esa va a ser nuestra plantilla. Y le damos un nombre. Llamemos a este índice son como nuestra página de inicio o algo así. Ahora cuando se trata de renderizar alguna vista, necesitamos una vista para renderizar que vamos a usar en vistas basadas
en clase en este curso porque esa es la forma correcta de escribir Django, al
menos en mi opinión lo es. Podemos escribir vistas basadas en funciones o podemos escribir vistas basadas en clases. Te voy a enseñar de la manera profesional en este curso vamos a usar vistas basadas en clase. Las vistas basadas en funciones son fáciles de aprender, pero es más fácil aprender basadas en clases y luego funciones en lugar de funciones y luego basadas en clases. Esto tiene que venir de algún lugar y necesitamos crear algún tipo de vista. Entonces, solo, no nos salvemos todavía, pero mantengamos esto abierto y pasemos a las vistas. Y se puede ver que ya está importando atajos de Django render. Honestamente podemos simplemente deshacernos de eso porque no vamos a estar usando una vista basada en funciones. Vamos a usar una vista basada en clase. Entonces vamos a ir o no ir a PERO importar de Django dot views dot genérico, importar una simple vista de plantilla. Y luego vamos a crear una vista de página principal. Entonces vamos a decir clase vista de página principal. Y esto va a heredar la vista de plantilla. Y vamos a darle un nombre de plantilla. nombre del guion bajo de la plantilla es igual a home.html. Y esto le está diciendo a Django buscar un archivo llamado home.html. Y eso es todo lo que vamos a hacer. Entonces vamos a guardar ese archivo ahora. Volvamos a las URL dot pi. Y si lo hacemos desde, porque esta no es la misma carpeta aquí, todos estos están en la misma carpeta. Podemos escribir vistas de punto importación. ¿ Y cómo se llamaba esa vista? Vista de página principal. Y entonces podemos decir, y aquí homepage ver punto como vista. Y esto va a renderizar nuestra lógica para nosotros. Va a hacer que nuestro punto de vista funcione en realidad. Ahora bien, todo esto está bien y bien. Pero probablemente te hayas dado cuenta de que Django realmente no ha estado reiniciando últimamente. Así que sigamos adelante y abrimos nuestras URL de mysite dot py y agregando un nuevo patrón de URL aquí. Ahora aquí podemos prefijar nuestra Página Principal si quisiéramos. Entonces podemos hacer que todo vaya a mi website.com slash home slash que una página, igual que hicimos con el admin, pero no queremos eso. Queremos que esta sea la página de inicio, así que vamos a dejar este camino en blanco. Entonces vamos a decir incluir y nos preocuparemos por estos importantes apenas un segundo. Alimenta URLs. Y vamos a darle a esto un espacio de nombres de feed. Ahora, las URL de alimentación e inclusión no existen todavía, al menos
no en este archivo. Entonces tenemos que hacerlos existir. Entonces hagámoslo desde Django.com direcciones URL de puntos, importar incluir. Y también importemos nuestros puntos de vista y nuestros puntos de vista, pero nuestros patrones de URL de nuestro feed. Hagamos de URL de importación de feed como URL de feed. Y así sólo estamos cambiando el nombre. Estamos importando URLs como un módulo completo. Entonces estamos importando todo este archivo aquí. Entonces lo estamos renombrando a URL de alimentación o URL de alimentación. Y luego simplemente vamos a poner eso cualquiera, sigamos adelante y guardemos esto y vimos reiniciar Django. Y vamos a ver que tengo un error tipográfico en algún lugar en las URL de alimentación. En la línea uno. No es Django dot URL, es Django dot URLs. Y volvamos a donde dice un error aquí. Y esto es bonito. Esto es solo, estamos depurando en este punto. Y esto dice que las URL de alimentación de ruta no están definidas. Y eso es porque dijimos feeds, URLs. El alimento es singular. Ok, cool, Cuckoo, cuco, cuco, Cool. Eso está funcionando todo. Encabezémonos más. Volver a nuestro navegador y actualicemos. Y obtenemos este error. La plantilla no existe. Ahora, ¿dónde ponemos esta plantilla? Django va a buscar esta plantilla en unos pocos lugares. Por defecto, está buscando en mi Pip env aquí. Y luego se va a buscar en Django Admin templates home. Django contra plantillas fuera casa. No tenemos acceso a esos. Esas no son carpetas que están en nuestro proyecto. Por lo que necesitamos decirle a Django que use plantillas en otro lugar. Y vamos a crear, en la siguiente lección, vamos a crear una carpeta llamada plantillas, y vamos a decirle a Django que lo registre como lugar para buscar nuestras plantillas. Entonces por ahora deberías tener todas estas URLs. Esto sí se pone un poco complicado porque estamos usando patrones de URL en mi sitio. También estamos usando patrones de URL en el archivo URLs. Bajo nuestros pies app. Ambos se llaman URLs dot pi. Esta es una convención de nomenclatura. Aquí es donde se pone un poco complicado son marcos como si estuvieran nombrando convenciones. Tenemos una app llamada feed. Coincide con nuestra aplicación aquí arriba que también se está utilizando en nuestro espacio de nombres. Entonces es todo lo mismo en todo el tablero
hablaremos de espacios de nombres en nuestras plantillas un poco más tarde. Entonces en nuestras vistas, simplemente creamos una vista de la página de inicio y luego sobrescribimos ese bonito Django View para darnos un error. Y una vez que veas ese error, estás listo para pasar a la siguiente lección.
7. Configuración de tu carpeta de plantillas: Muy bien, en la última lección nos dieron este error. Esta plantilla no existe en slash n está buscando home.html. Ahora sabemos que está buscando en lugares a los que no tenemos acceso. Y así podemos entrar en esta carpeta Usuarios Caleb Delian dot logos share Virgil posee Django 101,
yada, yada, yada, yada, yada, yada, slash Django, contra off plantillas. Ohm, eso es solo una pesadilla con la que lidiar y hay una mejor manera de vivir tu vida. Y así en esta lección, eso es lo que vamos a hacer. Vamos a decirle a Django, Hey, hay un mejor lugar para buscar plantillas. Entonces lo que tenemos que hacer aquí es que necesitamos entrar en el código VS que está cerrando eso hacia abajo. Eso no es relevante en esta lección. Vamos a cerrar los pies y vamos a entrar en nuestro settings.js y ajustes internos dot pi, tenemos esta cosa llamada plantillas. Si nos desplazamos hacia abajo, le veremos plantillas. Y está buscando directorios. Y entonces lo que queremos hacer aquí es crear un directorio de plantillas. Entonces voy a darle a esto una variable llamada template dire. Y esto aún no existe. Tenemos que hacerla existir. Plantilla Tintorero es igual a. Y en este punto en el tiempo, si no recuerdas esto, si estás montando un proyecto, digamos que dentro de un año, siempre
puedes simplemente Google esto, esta parte está por todo internet. Es fácil encontrar esta forma particular de habilitar ciertos directorios de plantillas. Por lo que hacemos OS punto path, dot join, nuestra base nefasta. Y vamos a darle una carpeta llamada plantillas. Y eso se supone que es una base nefasta. Y veamos si podemos encontrar funesta funesta. ¿Dónde estás? Ahí está en lo más alto aquí. Y así eso es buscar la ruta de este archivo en particular es resolverlo padre, padres. Entonces se está moviendo hacia arriba. Y eso nos va a dar nuestro proyecto basado que está justo aquí. Y luego va a crear una nueva plantilla o un nuevo directorio llamado plantillas. Ahora usamos el sistema operativo y así necesitamos importar SO. Por lo que decimos importar OS en la parte superior de este archivo. Adelante y veamos de qué se está quejando Django ahora. Entonces estamos recibiendo el mismo error, pero notan que dice que no lo puede encontrar porque está usando un cargador. No lo puede encontrar en plantillas, home.html. Adelante y agreguemos eso en. Todo lo que tenemos que hacer ahora es crear una nueva carpeta llamada plantillas. Y aquí podemos crear un nuevo archivo llamado home.html. Dejemos esto en blanco. No, mentí. Digamos HelloWorld y hagamos de esto un H1. Por lo que va a estar habilitado HTML. Y vamos a refrescar nuestra página. Y dice, hola mundo. Si esto no te funciona y has hecho todo correctamente, patea a Django, solo cancela a Django y reinicia a veces y no a menudo. Pero a veces necesitas reiniciar manualmente Django cuando estás desarrollando usando Django. Y así ahora tenemos algo aquí dentro, tenemos algo con lo que podemos trabajar. Pero sigamos adelante y haga clic derecho y fuente de la página del Visor. Lo único que dice aquí es HelloWorld. Y tiene una etiqueta H1 y cierre H1 y eso está bien. Pero y si quisiéramos tener un título en nuestra página actualmente no hay título. O que si quisiéramos decir que el idioma era el idioma era el inglés o que se suponía que esta página respondía por defecto. Bueno, actualmente lo que tenemos que hacer es HTML colon cinco hit tab y construye esta página hacia fuera para nosotros. Hola mundo, guarda, refresca tu fuente y obtenemos todo esto. Pero, ¿qué pasa si tenemos otra vista? Entonces tenemos que copiar todo esto. Tenemos que copiar todas esas cosas. Sobrescribir el título, sobrescribir el cuerpo, mantener todo lo demás igual. Y qué pasaría si quisiéramos añadir un nuevo metatag a todas nuestras páginas en el futuro. Bueno, puede que queramos o no escribir eso una y otra vez. Ahora si tu sitio es enorme y digamos que tienes como tal vez un 100 vistas diferentes. Vas a tener que copiar y pegar un 100
veces diferentes en un 100 plantillas diferentes. Eso es doloroso, esa no es forma de vivir tu vida. Hay una mejor manera de una mejor manera es usar esta cosa llamada plantilla base. Entonces sigamos adelante y solo deshacemos esto. Y en realidad voy a borrar eso por completo y voy a crear un nuevo archivo aquí en el directorio de plantillas. Y voy a llamarlo punto base HTML. Y aquí dentro le voy a dar HTML colon cinco cosas de compartir imágenes aquí. Y cuando volvemos a nuestra página, no
vemos nada. Eso es correcto. No queremos que haga nada. Está tratando de renderizar este home.html, no HTML de punto base. Porque si miramos el feed, las vistas decían, mira la plantilla llamada home.html. Actualmente no sabe sobre el HTML de punto base. Está en nuestro proyecto, pero Django aún no está al tanto. Y así lo que podemos hacer ahora es escribir extiende, punto base HTML. Y eso tiene que ser una cuerda. Y así utilizamos un signo de porcentaje de corsé rizado que la palabra clave se extiende. Y luego aquí una cadena llamada base dot HTML que coincide con el nombre de nuestro archivo HTML de punto base aquí. Y luego por ciento firma corsé rizado. Y eso cierra esa lógica. Adelante y refresquemos. Y aquí dice cosas. Y si vuelvo a la fuente, está todo aquí. Ahora. Eso es genial y todo. Pero si realmente queríamos cambiar algo en casa, digamos que esta es mi nueva página de inicio. Esto simplemente no va a aparecer. Simplemente no lo hace, no sabe qué hacer con él. Y así en la siguiente lección, vamos a hablar de bloques y cómo básicamente podemos escribir un poco de código en nuestro archivo HTML de punto base y simplemente inyectarle cosas. Y así piensas, puedes pensarlo como si tuvieras un trozo de papel y tienes un agujero cortado en él, y es sólo un círculo. Y luego tienes otro, ciertamente tienes otro pedazo de papel, pero está cortado en forma de círculo. Y así pusiste ese pedazo de papel en otro pedazo de papel. Al igual que cuando éramos niños, jugábamos con bloques y estamos tratando de encajar la plaza y la plaza, y estamos tratando de encajar el triángulo y el triángulo. Eso es exactamente lo que hace esto. Y vamos a aprender de eso en la siguiente lección.
8. Uso de bloques de plantillas: De acuerdo, en la última lección hablamos de una especie de encajar formas en formas y, ya
sabes, tratar de reemplazar las cosas aquí dentro tenemos un archivo HTML de punto base. Y el hogar se extiende entonces desde el punto base HTML. Pero en realidad no es hacer otra cosa que tirar todas estas cosas y queremos poder reemplazar algunas de ellas. Entonces hablemos de esta noción de bloques. Y así un bloque se ve así. Es un bloque de signo por ciento de tirantes rizados y luego un nombre. Y vamos a darle a esto un nombre de cuerpo. A veces se ve el nombre cuerpo, a veces se ve el nombre. Contenido. Realmente no importa cómo lo llames siempre y cuando sea consistente en toda tu aplicación. Y luego decimos bloque final. Y eso es todo lo que vamos a hacer en nuestro HTML punto base. Vamos a cerrar las vistas, vamos a cerrar los ajustes. No necesitamos esos y en nuestro home.html, hacemos lo mismo. Bloque, body stuff aquí desde home.html y block, y mira esa sintaxis interesante. Las plantillas de Django utilizan dos formas de sintaxis de síntomas. El uso de un corsé rizado y un signo de por ciento. Y esto básicamente dice ejecuta una lógica más avanzada. O si de verdad solo queremos imprimir cosas, usamos lo que yo llamo bigote doble y usamos dos tirantes rizados uno al lado del otro y luego los cerramos con los tirantes rizados opuestos, hablará de esos en un poco. Pero por el momento, vamos a refrescar nuestra página y vemos que dice cosas aquí desde home.html. Actualicemos nuestro código fuente. Y tiene todas estas cosas en ella ahora, más nuestro contenido de home.html. Ahora lo que tiene de bonito eso está en nuestro home.html y nuestra página de inicio. No tenemos que escribir toda esta basura. Todo lo que tenemos que hacer es decir hola, Django. Cuando renderices esta plantilla, agarra base dot HTML, léala para nosotros. Y entonces Django dice, está bien, sí ,
sí, lo tengo. Te tengo. Estoy leyendo HTML punto base, pero oye, por cierto, hay un bloqueo de tu cuerpo frío. Y así si quieres, puedo poner algunas cosas extra ahí para ti. Y decimos cool, cuco, Cool. Sí, en realidad lo hacemos. Tenemos algunas cosas extra. Queremos reemplazar tu bloque de cuerpo vacío por algunas de nuestras propias cosas. Y eso es literalmente todo lo que hicimos. Esta es nuestra página principal. Y cuando me refresco, dice que esta es nuestra página de inicio en nuestro código fuente, vuelve aquí, y esta es nuestra página de inicio. Por lo que ahora en realidad estamos trabajando con un par de plantillas diferentes. El bonito de esto es que podemos cambiar una cosa en nuestro HTML punto base. Y si simplemente decimos extiende punto
base HTML desde nuestro hogar o cualquier otra plantilla en el futuro. Toda plantilla heredará ese código. Por lo que ya no necesitamos preocuparnos por escribir la misma lápida cada vez, ni la misma declaración HTML o la etiqueta HTML. No tenemos que preocuparnos por nada de eso. Sólo podemos hacerlo una vez. Ahora como otro ejemplo, sigamos adelante y escribamos un bloque aquí, bloque, título y bloque. Y vamos a ver que nuestro título se va. Va a haber algo ahí dentro igual que localhost puerto 8 mil. Y en nuestro hogar, hagamos título de bloque, página de inicio y bloque, y en realidad lo llamemos algo mucho mejor. Maurice, página de inicio super impresionante. Refrescar. Y dice mi super impresionante página de inicio. Y de nuevo, todo lo que hicieron fue decir, Hey, aquí hay un título de bloque. Nos estamos extendiendo desde el punto base HTML. Aquí hay un título de bloque. Todo lo que realmente hicimos fue decir, oye, agarra este código y es como COP copiándolo y pegándolo aquí. Es así. Ahora sólo voy a deshacer eso. Y una cosa más que podemos hacer es que podemos dar contenido predeterminado aquí. Por lo que el título predeterminado en caso de que alguna vez se olvide de agregar el título del bloque en una plantilla. Digamos, whoops, caled se olvidó de agregar eso ahí dentro. Vamos a refrescar nuestra página y dice título predeterminado. Entonces si no lo
sobrescribimos, ahora tenemos una base aquí, un valor predeterminado. Si lo sobreescribimos, entonces va a usar lo que hayamos usado en su lugar para que guarde esa actualización y dice mi página de inicio súper impresionante. Y así es como usamos los bloques. Eso es literalmente todo lo que hay a una cuadra. Es simplemente como esa metáfora que hice en la última lección. Cuando éramos niños y teníamos esa pequeña zona de juguetes. Fue como, aquí hay un círculo encajado en el círculo o aquí hay un cuadrado o un cubo encajado en la forma que parece un cuadrado o un triángulo. Eso es literalmente todo lo que es. Se trata de R cubo. Esto es r al cuadrado. Simplemente estamos ajustando una forma en otra.
9. Contexto de páginas personalizadas: De acuerdo, hablemos de agregar algún contexto personalizado a nuestra página porque ahora mismo nuestra página de inicio es genial, pero honestamente es difícil codificado. No hay variables en absoluto. No hay forma de agregar ninguna lógica personalizada a esta cosa. Y así en este punto en el tiempo donde realmente solo tenemos un sitio web estático realmente elegante. Está usando Python, está usando Django, pero es estático. No hay contenido dinámico para ello. Entonces sigamos adelante y hablemos de esta cosa llamada contexto. Entonces vamos a cerrar nuestro HTML punto base porque ya no necesitamos eso. Y abramos nuestros puntos de vista y punto py. Y en nuestra vista de página principal, podemos tener un método aquí llamado getContext. Es un método en una clase, por lo que siempre toma auto como su primer parámetro, y luego toma args de palabras clave. Y entonces básicamente estamos trabajando con esta cosa llamada contexto. Y a qué contexto es, es que podemos agregar datos aquí desde la lógica personalizada Python Python. Y entonces podemos arrojar eso en nuestro contexto de cotización sin comillas y usarlo dentro de nuestra página. Entonces vamos a batir rápidamente a través de un pequeño ejemplo aquí y luego te voy a mostrar exactamente cómo descubrí que los datos de GetContext incluso existen. ¿ Cómo, cómo existe esto? ¿ Cómo sé que esto existe? Te voy a mostrar cómo me enteré de eso. Entonces voy a hacer el contexto es igual a super, y eso va a subir a la vista de plantilla punto obtener datos de contexto. Y nunca pasaríamos en uno mismo, pero podemos pasar en nuestra palabra clave, args son quarks, y simplemente, simplemente regresamos contexto. Aquí dentro. Esto es básicamente un diccionario. Podríamos decir, Mi cosa es igual a hola mundo, cara
sonriente con una lengua colgando. Mundo de la esperanza, Hola Mundo. Esto es dinámico. Django se reinicia. Y lo que puedo hacer aquí es que puedo tomar esto, lo
mío, ir a home.html. Y en lugar de leer, esta es nuestra página de inicio porque esto es simplemente una variable. Nosotros, no queremos hacer ninguna lógica extra con ella. No estamos escribiendo un cuatriciclo. No le estamos diciendo a Django que ajuste una forma en forma usando un bloque. No estamos haciendo nada de eso. Simplemente queremos imprimir algo a la página. Utilizamos la sintaxis de bigote doble. Entonces un corsé rizado, corsé rizado, luego algunas cosas en el corsé rizado final, corsé rizado. Ahora dentro de aquí, simplemente decimos lo mío y que lo
mío viene de aquí mismo, lo mío. Adelante y refresquemos nuestra página. Y dice, hola mundo, esto es dinámico. Ahora en nuestra plantilla, no dice eso, pero en nuestra opinión sí. Entonces ahora podemos tener alguna forma de lógica y esto está empezando a ponerse un poco más dinámico. Ahora esto todavía no es un gran ejemplo y
trabajaremos con esto para que sea un mejor ejemplo en el futuro. Pero en este momento, este es un ejemplo bastante decente de cómo básicamente podemos realizar alguna lógica de Python. Ponlo en una cadena o un número o cualquier cosa que realmente queramos, y luego acceda a ella en la plantilla. Ahora te mencioné, te iba a mostrar de dónde obtuve los datos de GetContext. Y hay algunos sitios increíbles de Django por ahí. Uno de ellos se llama CC BV, vistas basadas en
clase con clase. Y así es CC-BY v dot CIO dot UK tiene diferentes versiones de Django. Y aquí estamos usando Django tres, por lo que se selecciona automáticamente. Y estoy usando una vista de plantilla. Y de donde saco eso es esta vista de plantilla. Y todo lo que está haciendo es renderizando una plantilla. No es hacer nada extra. Hay muchas vistas diferentes aquí. Hay una vista de inicio de sesión, Logotipo, hacer vista de detalle, todo tipo de cosas. Vamos a estar trabajando con algunos de estos en Django 101, pero en este momento solo estamos trabajando con nuestra vista de plantillas. Por lo que hago clic en vista de plantilla y me dice qué tipo de contenido puede ser, contenido
extra nombres de métodos HTTP. Entonces, esto se permite tener un GET, post, PUT, parche, eliminar opciones de cabeza o trazar encabezados HTTP. Honestamente, sólo estamos usando get. Por lo que podría configurar esto para que solo obtenga un motor de plantillas de clase de respuesta y un nombre de plantilla. Actualmente sólo estamos usando el nombre de la plantilla porque todo lo demás se hace automáticamente por nosotros o se maneja por nosotros. Y lo que me gusta llamarlo porque es una especie de magia se maneja automágicamente para nosotros. Y entonces tenemos estos métodos. Y tenemos como vista que en realidad hemos utilizado, lo
creas o no, en nuestras URL dot py, homepage dot as view. Y podemos ver qué está haciendo como vista. Y es hacer todas estas cosas automáticamente para nosotros, así que no tenemos que escribir eso. El despacho es como nuestro método init casi lo, se ejecuta básicamente justo después de init, más o menos eso es cierto. Y tenemos uno aquí llamado datos getContext. Y acabo de saber que ese contexto es como lo llamamos. Y eso es porque he leído a través de los docs de Django algunas veces y así estoy familiarizado con esa noción. Si no has leído a través de los docs de Django, definitivamente pasa un poco de tiempo y lee los docs de Django cuando, ya
sabes, cada vez que tengas cinco o diez minutos extra, hay muchos docs, así que te va a llevar un largo tiempo. Es que no es algo que puedas leer en una hora. Y los perros están bastante bien escritos. Entonces los datos de GetContext están haciendo esto. Se necesita auto y args de palabras clave, que es hacer, hacer, hacer, hacer, hacer, obtener datos de contexto. Yo. Palabra clave args va a hacer quarks que establecen vista por defecto es igual al yo. Si self.content no es ninguno, haga algunas otras cosas de lo contrario, devuelva la palabra clave args. Y básicamente dijimos, sí, genial, lo que sea que Jack estuviera haciendo, hagamos lo mismo. Por lo que agarramos nuestro contexto mediante el uso de super dot get data context, pasando esos mismos quarks que se están pasando a nosotros. Agregó un poco de contexto y volvió a todo el asunto. Entonces en el futuro cuando estás aprendiendo, ya
sabes, un poco más avanzado Django. Siempre puedes ir a CC-BY V y Doo-doo-doo-doo, sólo a la espera de que esto se cargue. Aquí hay todo tipo de cosas. Así que siéntete libre de tomar un poco de navegación a través de esto. Pero en su mayor parte nos vamos a quedar con algo básico por ahora como para no abrumarte. En futuras lecciones, podrías incluso verme referencia CCB v, Sólo porque honestamente es un gran recurso tener fin. Nos dice cosas como, como,
como cuando estamos usando datos de get context, ¿acepta una solicitud? ¿ Acepta args? Hace excepto solo auto y quarks. ¿ Qué acepta? No lo sabemos, y tal vez necesitemos saber eso cuando usamos super. Y así esta es una referencia realmente buena para eso. En la siguiente lección, sigamos adelante y mostremos nuestras publicaciones en nuestra página principal.
10. Mostrar publicaciones dinámicas: De acuerdo, en la última lección hablamos de los datos de GetContext. Y agregamos esta cosa llamada cosa mía, y es simplemente una cuerda. Lo mío es una cuerda en rimas. Y no quise decir eso rimar ni más rimar. Y quiero decir que a alguien le gustaría una pequeña referencia de película de cacahuete ahí si eres un buff del cine de La princesa novia. Y así vamos a seguir adelante y a intercambiar lo mío por mensajes. Y lo que queremos hacer es que queremos conseguir nuestros modelos. Tenemos estos posts y lo hicimos como el primer par de lecciones. Whoo, eso se puso demasiado grande. Tenemos estos posts aquí dentro, así que tengo este post uno aquí. Vamos a seguir adelante y guardar eso, añadir otra publicación. Este es un segundo post. Ahorra en un puesto. Esta es una tercera publicación guardar. Y ahora realmente hagamos el show en nuestra página, porque en este momento no aparece nada. Y entonces lo que queremos hacer es que queremos agarrar estos posts y conseguir todos ellos. Y así lo que podemos decir aquí son contextos, posts es igual a post y estoy obteniendo ese nombre de esta clase. Todavía no lo hemos importado, lo haremos en tan solo un segundo. Pero esta clase nombre puntos objetos porque sorpresa, sorpresa. Básicamente todo en Python es un objeto. Y en Django, siguen siendo objetos. Está escrito en Python, así que todo es un objeto dot todo. Y eso va a conseguir todos nuestros puestos para nosotros. Entonces podemos decir desde DOT modelos import post. Y eso simplemente nos va a permitir agarrar este post, tirarlo a nuestros puntos de vista dot pi. Y luego cuando se renderece esta página, va a decir ejecutar datos GetContext, hacer lo que haga Django. Y hay una variable aquí llamada posts. Y van a ser todos los puestos. Y así vamos a ir a intercambiar lo mío por publicaciones en la plantilla. Y simplemente vamos a por ahora por el momento, usar sintaxis de bigote doble. Adelante y refresquemos esto. Y vemos esta cosa rara, esta cosa llamada conjunto de consultas. Y así en una base de datos cuando estás buscando datos, se llama consulta. Y tenemos un conjunto de una consulta aquí. Entonces tenemos nuestro primer post, y este es un nuevo post, segundo post y tercero. Y esto es algo así como una lista. Esta es una lista de Django realmente, realmente elegante. Y así podemos recorrer estos ahora. Y así en lugar de escribir posts, lo que podemos hacer es deshacernos de este H1. No necesitamos eso ahí dentro. Podemos decir para publicar Posts. Y cuatro, enséñame una cosa. Pongamos aquí una regla horizontal. Y esto debería mostrar tres veces. Muéstrame una cosa, muéstrame una cosa. Ahora esto es, déjame arreglar esa cuz sangrante que me va a enloquecer. Esto es bucle para cada post. Y sabemos que cuando recorremos cada pieza de datos de una lista, tenemos ese ítem exacto. Y esto es como hacer un bucle a través de una lista en Python. La única diferencia es que esta lista viene con cosas extra. Entonces es como hacer un bucle a través de una lista de diccionarios. Y así ahora tenemos post y texto. Y así podemos hacer textos postdoc Entrar plantilla. Y así vamos a seguir adelante y escribir texto post dot. Refresca tu página y dice, déjame acercar aquí. Este es un nuevo post, esto como segundo post. Este es un tercer post. Adelante y sumamos uno más aquí. Hagamos eso más pequeño otra vez. Y Doo-doo-doo-doo, Este es un cuarto post, guardar. Y cuando nos refrescamos, boom. Ahora tenemos datos que se ponen en una base de datos y datos que se sacan de una base de datos y se renderiza en una plantilla. Esto es literalmente todo lo que necesitamos hacer para esta lección en particular. En la siguiente lección, sigamos adelante y agreguemos aquí algunas imágenes.
11. Añadir imágenes a tu modelo: De acuerdo, hablemos de cómo podemos agregar una imagen. Y así podemos hacer algunas cosas diferentes. Pero estamos, vamos a una especie de eludir algunas de las entresijos. Y vamos a trabajar exactamente en nuestros modelos, punto-punto. Y así Django nos da esta cosa llamada modelo es.5 campo. Y podemos subir cualquier forma de archivo. Pero eso no es precisamente lo que queremos. Porque tal vez queremos tener algunos thumbnailing y esas cosas también. Entonces lo que vamos a hacer ahora es instalar un nuevo paquete. Y vamos a usar ese paquete. Entonces voy a hacer referencia a los muelles justo delante de ustedes, y les voy a mostrar exactamente cómo lo hago. Entonces voy a eliminar eso, volver a mi navegador y escribir el paquete de miniaturas Django. Django miniatura, y eso no es lo que escribo paquete. Y ahí están las miniaturas de Django, ahí está la miniatura de Sorrell. He usado miniaturas de suelo una o dos veces antes de ella. Al parecer he hecho clic en esto
para, para, para, para hacerlo echemos un vistazo a nuestros docs aquí. Características de un vistazo soporta Django 3.1. Eso es lo que estamos usando, eso es importante. Soporte de Python tres, muy importante. Soporte de almacenamiento, eso es bueno. Plug-in Soportes de motor, imagen de almohada ,
magia, píldora, varita, todo tipo de cosas. Estas son todas cosas buenas. Si no sabes cuáles son esos, está bien. Admin integración con posibilidad de eliminar, generación
ficticia debido a, debido a hacer todo tipo de cosas. ¿ Tenemos solución alternativa de thumbnailing y recorte, versiones de resolución
alternativa de un cálculo de margen de miniatura para posicionamiento vertical. Esta lista me parece prometedora. Y así cómo utilizar el código pip instalar miniatura Sorrell. Entonces vamos a agarrar eso. Y en nuestro entorno virtual simplemente voy a pegar pip instalar miniatura Sorrell. Y si estás usando Pip env como yo, deberíamos estar usando pip install varios thumbnail de cualquier manera y aún podemos hacer Pip mostrar miniatura de tristeza. Y eso nos muestra que estamos usando la Versión 12.7, 2.0. ¿qué más tenemos que hacer? Tenemos que poner miniatura de suelo en aplicaciones instaladas R. Hagámoslo. ¿ Dónde estamos aquí? Mi configuración de sitio instaló aplicaciones. Nos vamos a desplazar hacia abajo. Vamos a tirar eso en algún lugar del medio, así. Y luego hay algo de uso aquí,
pero en realidad necesitamos agregarlo a nuestro modelo. Aquí está el uso modal. Nosotros queremos seguir esto. Entonces volvamos a nuestras modelos dot py. Y qué vemos aquí de Sorrell thumbnail import image field from Sorrell dot thumbnail, import image field. Y aquí dentro podemos decir que la imagen es entonces igual a ese campo de imagen. Y así ahora estamos usando un paquete de terceros que capas encima de Django, que capas encima de Python para básicamente crear un campo de imagen. Entonces podemos subir imágenes y luego minibarlas bien en nuestra plantilla, Django no viene con esto por defecto, sólo porque Django es bastante desnudo,
te da el mínimo desnudo y te permite extenderte para hacer lo que quisieras hacer. No está destinado a tener todas las soluciones integradas en él. No está diseñado de esa manera. Y la razón de eso es porque si fueras a crear un sitio web que no necesitara. Miniatura de Sorrell y vino con miniatura oral. Eso es solo cargar cosas extra, eso son cosas extra para descargarlas, simplemente no vale la pena. Y así dice Django, sí, otras personas pueden construir estas extensiones. Por lo que agregamos este campo de imagen aquí. Vamos a seguir adelante y correr, ejecutar servidor. Y dice, mira este feed, esa es nuestra app, posts, esa es nuestra clase. Imagen, ese es nuestro campo. No se puede utilizar el campo de imagen porque la almohada no está instalada. Pista, consigue almohada en o ejecuta Python dash M pip instalar Almohada. Entonces hagámoslo. Pip instalar almohada con un P. mayúscula Vale, ya está hecho. Vamos a correr de nuevo a Django. Tenemos uno sobre migración aplicada. Hagamos Python administrado hasta alto migrar. Y esto es aplicando nuestra inicial en miniatura. Genial, eso es de nuestro paquete de terceros. Entonces es aprovisionar una cosita en nuestra base de datos. Veamos si podemos hacer nuestras nuevas migraciones porque necesitamos hacer nuevas migraciones. Entonces estas migraciones que acabamos de correr vinieron de la miniatura de Sorrell. Cuando hacemos migraciones aquí, lo que estamos diciendo es Django,
oye, toma una instantánea de lo que actualmente tenemos frente a lo que solíamos tener. Y si hay algún cambio ahí, crea un archivo de migración. Y así lo tenemos, dijimos que esta clase de post ahora tiene un campo de imagen en ella. Y así sigamos adelante y corremos, hagamos migraciones. Y esto va a decir que no se permite que el campo de imagen sea nulo. Podemos presionar uno para proporcionar un valor predeterminado de una sola vez, o podemos golpear dos. Y vamos a establecer un valor predeterminado en los modelos dot py. Eso es justo aquí. Podemos decir que algo como el default es igual a algo. Sin embargo, no sabemos cuál es el defecto. Entonces sigamos adelante y digamos uno y veamos qué pasa. Y yo sólo voy a escribir uno y tal vez esos descansos, tal vez esto no. Si se rompe, te mostraré cómo arreglarlo. Y me voy a llevar el número uno aquí. Por lo que creó un nuevo archivo de migración llamado 000 para publicar imagen. Y así si hacemos clic en esto, tiene una dependencia del archivo de migración original. Por lo que necesita ese archivo. Y luego se va a decir para las operaciones cosas que deben hacer, agregar un campo. Y ese campo viene de los campos de miniaturas de punto de suelo campo de imagen de punto. Es un defecto de uno. Eso es lo que escribimos para subir. No le dimos una subida a. Eso es igual que una carpeta a la que obtenemos subir si queríamos preservar el falso predeterminado. Y así básicamente esto nos va a dar una nueva columna en nuestra base de datos. Sigamos adelante y ahora corremos migrar. Y así originalmente cuando hicimos nuestras migraciones, simplemente
hicimos este archivo, no lo ejecutamos. Entonces corremos migrar y dice, oye, Python, Por cierto, quiero que te lleves este archivo y quiero que lo apliques a mi base de datos. Entonces vamos a volver a ejecutar Django y ver cómo se ven las cosas ahí dentro. Las cosas hasta ahora se ven bien. Volvamos a un navegador. Oh, vamos a ver si en realidad rompimos algo. Está bien, eso se ve bien. Cuarto puesto actualmente fijado en uno. Eso no es para nada lo que queremos, pero podríamos cambiar eso. Entonces lo que voy a hacer aquí es que simplemente voy a eliminar todos estos porque quiero añadir unas nuevas imágenes. Entonces voy a seleccionarlos a todos. Elimina, post seleccionado go va a decir, ¿estás seguro? Sí, estoy seguro. Agrega una nueva publicación. Este es el primer post. Y agreguemos una imagen. Y agreguemos una imagen de Galli, Galli a dot-dot-dot JPEG Abrir Guardar. Y ahora hay un archivo aquí y en realidad podemos incluso hacer clic en eso. Y dice, oh, no, esto en realidad no existe. Y más allá de eso, si miramos aquí, cerremos todos esos expedientes. Nuestra imagen está aquí. Entonces digamos que tenías 10 mil imágenes. Ahora tienes una carpeta llamada Feed, la carpeta llamada mysite folder llamada templates, tu base de datos, 10 mil imágenes administradas hasta arriba, Pip file, Pip file dot loc. Esa no es forma de vivir tu vida. Queremos poner todos nuestros archivos son archivos multimedia. Así es como los llamamos. Todos nuestros archivos de medios en una carpeta llamada Medios. Y eso es lo que vamos a hacer en la siguiente lección. Entonces en este momento tenemos una configuración de campo de imagen, sin mostrar nada en nuestra página de inicio todavía. Necesitamos configurar nuestra carpeta de medios para
que todas nuestras imágenes se suban a una carpeta en particular. Y esto es realmente bonito si alguna vez necesitabas comprimir todas tus carpetas o todas tus imágenes más bien, puedes comprimirlas todas con bastante facilidad. Podrías eliminarlos todos con bastante facilidad. Puedes trabajar con ellos más fácil si están en una carpeta. Entonces en la siguiente lección, sigamos adelante y configuremos nuestra carpeta de medios.
12. Configuración de tu carpeta de medios: De acuerdo, echemos un vistazo a agregar una carpeta de medios a nuestros proyectos para
que todas nuestras imágenes no se suban directamente a la raíz de nuestro proyecto. Para hacer eso, tenemos que abrir mi configuración del sitio dot py, y casi en cualquier lugar supongo, vamos a tirarlo aquí. Podemos escribir URL de medios, y este sólo va a ser el nombre de nuestra carpeta. Y va a ser slash media con una slash al final y al principio. Entonces vamos a escribir nuestra raíz mediática. Media root va a ser OS dot, dot join, base dire. Y luego escribimos medios sin una baraja al principio. Y así esta parte de aquí parece bastante familiar, ¿no? Eso lo configuramos con nuestro directorio de plantillas. Pero en lugar de usar la carpeta de plantillas, estamos usando la carpeta de medios. Y nuestra URL de medios va a ser cuando estés accediendo al contenido. Cuando vas a mi website.com slash algo, ¿cómo se llama esa carpeta? Dondequiera que esté esa carpeta, y luego tu imagen dot JPEG o lo que sea. Por lo que necesitamos el ajuste, a pesar de que actualmente no lo estamos usando, necesitamos ese ajuste. Entonces vamos a pasar a nuestras URL dot py. Y tenemos que escribir algunas cosas interesantes aquí. Entonces vamos a modificar un poco esto. Entonces primero cosas primero vamos a necesitar nuestra configuración. Entonces hagámoslo, primero que nada movamos esto hacia arriba para que esté en orden alfabético. Al igual que una buena práctica de Django.com, importar ajustes. Y luego vamos a importar también esto, esta función llamada estática desde Django.com. URL de punto, punto estático, importación, estática, no de estado, es estática. Entonces en la parte inferior, decimos si la configuración dot debug. Y lo que significa debug es, ya sabes, cuando no teníamos una plantilla y decía
que hay un error de plantilla y nos mostró dónde
estaba buscando esa plantilla en particular. Eso es lo que hace depurado. Depurar nos permite averiguar fácilmente qué está pasando. Y en producción cuando lanzas tu sitio web, en realidad
apagamos esto para que la gente no pueda ver toda esa información extra porque eso hará vulnerable tu sitio. Pero mientras lo estamos codificando, queremos que esté habilitado y esté habilitado por defecto. Entonces decimos nuestros patrones de URL. Añadamos a este patrón de URL. Vamos a decir ajustes estáticos, URL de medios. Y luego la raíz del documento, subrayado del documento. Root es igual a settings.me root media route. Y así esto es solo usar un lenguaje Python vatios bastante estándar. De verdad. Estamos importando ajustes todo el archivo. Y entonces estamos usando la propiedad en ese archivo. Solo estamos importando ajustes. Nuevamente, es básicamente un objeto. Y luego estamos usando la ruta de los medios y lo obtuvimos de nuestra configuración aquí, media URL, media root. Entonces sigamos adelante y guardémoslo y veamos qué pasa. Está bien. Parece que no pasó nada. Pero vayamos a refrescar esta página y luego cambiemos esta imagen en lugar de gulley a, pongamos panza de delhi. Guarda eso. Y vamos a verlo. Y en realidad se puede ver medios de slash, gully belly dot JPEG. Y echemos un vistazo a nuestro proyecto aquí ahora tenemos una carpeta llamada Media y gully belly está ahí dentro. Eso es fantástico. Ahora podemos deshacernos de gulley también, porque esa era nuestra original. Eso es borrar eso. Ya no necesitamos eso. Y todas nuestras carpetas o no o carpetas, pero todos nuestros archivos se van a subir a la carpeta de medios. Entonces como una recapitulación rápida, lo que hicimos fue agregar media URL y media root. Y esto se parece mucho a cuando creamos nuestra plantilla o ruta de plantilla. Doo-doo-doo-doo, este, nuestra plantilla funesta. Esta es nuestra raíz mediática. Y luego usamos una URL de medios y esa raíz de medios en nuestros patrones de URL. Y así la idea aquí es que cuando sirvas archivos estáticos con depuración activada, Django te va a servir esos archivos. Esa es técnicamente una forma insegura de usar Django. Entonces cuando inicies tu sitio web en algún momento del futuro, no
quieres estar usando eso y vas a tener depuración desactivada y tus archivos estáticos se van a romper. Entonces puedes usar algo como el motor X para revertir el
proxy de las imágenes y configurarlo de esa manera. No vamos a hablar de eso por, por ahora mismo, sólo porque eso se vuelve un poco más complicado
y un poco demasiado abrumador cuando solo estás aprendiendo Django. Pero por ahora, esto es lo que necesitamos para ponernos en marcha. Sólo eso. En nuestra siguiente lección, sigamos adelante y en realidad agreguemos esta imagen a nuestra plantilla de inicio.
13. Añadir imágenes a tu plantilla: Okey-dokey, agreguemos imágenes a su plantilla de inicio. Porque si tomamos un adelanto y podemos cerrar eso. Si tomamos una vista previa de nuestra página, simplemente dice que este es el primer post, pero aquí no hay imagen. Adelante y agreguemos una imagen aquí. Y así tenemos que abrir nuestras plantillas a casa. Y sabemos que hay post-impuesto. Y de donde estoy sacando eso es modelos dot py post 2.txt. Ahora tenemos una imagen. Podemos hacer post.Toda imagen. Entonces, solo imprimamos eso y veamos qué nos da eso. Hagamos un BR aquí, post imagen de punto. Veamos qué nos devuelve esto. El nombre de la imagen. Probablemente podría hacer post imagen de punto, URL de punto. Sí, ahí está, esa es la URL real. Y si fuera a envolver esto en una imagen, IMG SRC es igual a. Vamos a ver que se trata de una imagen gigante, gigante, gigante. Necesitamos una miniatura porque esta imagen es tan grande. Tan grande. Mira esa linda cara. Y quería una imagen más pequeña porque esta imagen que conozco ya es de más de tres megs. Y si vamos a mostrar como un 100 imágenes, eso es alguien tiene una descarga 300 megabytes para ver tu página web, eso es simplemente inaceptable. Entonces lo que podemos hacer ahora es referirnos a nuestros docs de miniaturas Sorrell. ¿ Y cómo hacemos esto? Dice Uso de plantillas. Queremos cargar una miniatura. Entonces volvamos a nuestra página de inicio y pongamos carga bajo extiende. Extender siempre debe venir primero y luego cargamos. Y entonces qué calificamos? Decimos que este es un uso sencillo. De acuerdo, solo voy a copiar y pegar esto para ser honesto. Doo-doo-doo-doo. Y así esto va a usar una miniatura que viene de aquí arriba. Item.name, imagen. No tenemos artículo, tenemos imagen post punto, 100 por 100 y vamos a hacer 200 por 200 crop center como m. Y entonces podríamos decir las fuentes de imagen I M dot URL width as I m dot width, height is I m dot height. Sigamos adelante y guardemos eso. Y volvamos aquí. Simplemente refresca. Y nos creó una miniatura. Enfriar, así que esa es una imagen perfectamente centrada de 200 por 200. Adelante e inspeccionemos esto. Y creó esta rara URL para nosotros. Abramos esto en una nueva pestaña. Y esta es la imagen. Está en nuestra carpeta de medios. Creó automáticamente una carpeta de caché llamada BB C1, y luego algún tipo de hash. Y eso es simplemente usar el almacenamiento en caché para nosotros, por lo que no tiene que regenerar la miniatura cada vez que alguien accede a tu sitio web. Entonces eso es realmente bonito. Y la primera vez que cargamos el sitio web, te das cuenta que probablemente tomó como 2.5th más rápido, 2.5th más lento. Más bien, cuando refresquemos esta
vez, va a ser prácticamente instantáneo. No vemos ni un flash ni nada. Es solo boom, está hecho cargando. Adelante y sumamos un segundo post. Entonces, vamos a salvar esa. Este es un segundo post. Añadamos una imagen. Añadamos ruibarbo. Ahorra, y vamos a refrescar nuestras páginas. Deshazte de nuestra consola aquí, refresca nuestra página. Oh, mira, ahí está el ruibarbo. Adelante y sumamos uno más. Este es un tercer post. Y agreguemos una foto de ruibarbo y barranco. Y éste es uno grande. Esto es de 4.2 megs. Gracias a Dios. Estamos thumbnailing. Y ahí está. Todo esto está listo y corriendo para nosotros. En la siguiente lección, lo que me gustaría que hiciéramos es
poder hacer clic en una de estas imágenes e ir a otra URL en algún lugar y ver la imagen completa.
14. Añadir una vista detallada: De acuerdo, lo que me gustaría que hiciéramos es poder hacer click ya sea en este texto o en la imagen o en ambos. Y luego ve a ver una página web diferente donde mostramos la imagen completa, la versión sin comprimir. Y para ello, utilizamos esta cosa llamada vista de detalle. Y así está justo en el nombre ahí, es una vista de detalle. Tenemos que añadir una nueva vista. Entonces vamos a entrar en nuestro feed, vamos a las vistas. Y agreguemos una nueva vista de detalle. Y esto viene de la vista de detalle genérica. Y si no estás seguro de dónde llegué a ver detalle o no estás seguro de dónde importar esto porque no tienes que recordar todas las importaciones. Eso solo viene con escribir Django y Python a lo largo del tiempo, empiezas a recordarlos. Pero si no sabes de dónde viene, siempre
puedes ir a C,
C B v dot c o dot UK. Y eso te dirá exactamente de dónde viene. De hecho, te mostraré de dónde viene. Tenemos una vista de detalle. Dónde estás vista de detalle genérica. Y dice justo aquí desde Django dot genérico importar la vista de detalle. Y podemos hacer todo tipo de cosas aquí. Y así tiene un nombre de objeto de contenido content_type, contexto extra. Si quisiéramos agregar contexto extra, métodos
HTTP, un modelo, necesitamos establecer ese modelo. Clave primaria URL, palabra clave, yada, yada, yada, yada, todo tipo de cosas. No vamos a trabajar con mucho de esto. Simplemente vamos a trabajar con algo de esto. Por lo que necesitamos crear una nueva vista de detalle. Entonces hagamos clase. Y llamémoslo Post vista de detalle. Y esto va a heredar de Jen va vista de detalle. Entonces le damos un nombre de plantilla. Y ese nombre de plantilla simplemente va a ser detallado layout.html. Y ese modelo va a ser post. Y ese post viene de aquí arriba, que viene de nuestro modelo aquí. Y realmente todo lo que estamos diciendo a estas alturas es decir, ya
sabes, tenemos este modelo, tenemos como vista de detalle. Si vas a una URL en particular, solo trabaja automágicamente para nosotros, busca esa imagen en particular para nosotros, esa publicación en particular. Y así no tenemos que hacer una búsqueda. No tenemos que preocuparnos por administrar tu base de datos. Django maneja esta vista de detalle para nosotros y todo lo que tenemos que hacer es escribir las dos líneas de código. Es honestamente una cosa hermosa, hermosa. Entonces guardo que Django se reinicia, no pasa nada. Lo que tenemos que hacer ahora es entrar en nuestras URL o alimentar URL. Y tenemos que agregar otra ruta aquí para que podamos escribir path, digamos detalles slash algún tipo de entero que va a ser el id de post Y renderizar una vista. Y el nombre va a ser, solo llamémoslo detalle. Y esto debería ser más así. Entonces no hagamos detalles ASU detalle y en lugar de int, porque eso sólo va a renderizar mi website.com slash details slash int. Queremos decir I N T colon PK. Por lo que está buscando un entero. Y cuando renderiza nuestra vista aquí, va a estar renombrando ese entero, sea lo que sea. Por lo que podría ser como website.com
slash detail slash uno va a mirar ese entero y lo va a nombrar pk. Entonces necesitamos renderizar una vista. Y esa vista se llama vista de detalle post. Entonces si vuelvo a las URL y vamos a hacer desde DOT vistas importar vista de la página principal. También importemos la vista de detalle de la publicación. Y esa es una clase así que usamos como vista. De acuerdo, Django no se quejaba hasta ahora. Entonces, hasta ahora, tan bueno. Adelante y probemos esto solo para ver dónde estamos. Entonces, antes que nada, necesitamos una identificación. Si hago clic en esto, dice el ID aquí arriba, los posts son ocho. Entonces vayamos a la escuela a echar un vistazo a la postfecha. Por lo que ahora podemos hacer nuestro sitio web localhost puerto 8 mil slash detalle slash ocho. Y algo aquí dentro es más o menos o. y eso es porque puse un listón al final aquí, y debería haber un corte justo ahí. Entonces sólo espera a que Django se reinicie, refresca. Y deberíamos obtener un error Template Not Found. Hay una plantilla no existe. Árabes en busca de layout.html detallado. Ahora, ¿dónde se ve esto? Si bien se va a buscar en nuestra carpeta de plantillas llamada detalle, llamada detallado dot HTML. La carpeta Plantillas se llama plantillas. El archivo se llama detalle dot HTML. O se va a buscar en este paquete, o se va a buscar en este paquete. Así que vamos a darle el primer lugar que está buscando plantillas, detallado layout.html. Por lo que entramos en nuestras plantillas, nuevo archivo, detalle dot HTML. Y sólo escribamos hola mundo. No hagamos nada de fantasía aquí. Hola mundo con corazón. Ahora eso no va a funcionar. Es HTML con sonriente. Enfriar. De acuerdo, tenemos una vista siendo renderizado aquí. Esta es una buena noticia. Vamos a seguir adelante y extender la base. Porque si respaldo realmente rápido, veamos la fuente. Ahí adentro no hay nada. Vamos a seguir adelante y extendernos, se extiende. Punto base HTML. Vamos a refrescar una página. Parece que no pasó nada, pero si vuelvo a ver la fuente de la página, tenemos cosas aquí con un título predeterminado. Entonces hagamos bloque, título, detalle, vista y bloque. Y cambió el título ahí arriba. Eso es bueno. Eso significa que esto está funcionando. Bloque, cuerpo y bloque. Aquí es donde irá mi imagen. Aquí es donde va a ir mi imagen. Entonces lo que voy a hacer es que voy a parar aquí. Y en la siguiente lección realmente vamos a llenar algunos de los detalles de esta página. No vamos a hacer que se vea genial, pero vamos a llenar algunos de los detalles de esta página.
15. Plantilla de detalles: Muy bien, bienvenido de nuevo. Esta es nuestra página de Detalle. Se supone que esto muestra aquí esta imagen, ruibarbo y barranco. Actualmente no muestra nada, nada aquí dentro como dinámico. Ahora sabemos que podemos usar los datos de GetContext, pero no necesitamos hacer eso porque Django maneja muchas de esas cosas para nosotros. Por lo que abrimos nuestras vistas dot py. Estamos usando un nombre de plantilla llamado layout.html detallado. Y estamos diciendo que modelo es post. Si abrimos nuestras URL dot py, nuestro camino es detalle y luego algún tipo de número. Y va a averiguar automáticamente que hay un entero ahí dentro, reasignarlo a la variable llamada pk. Y en algún lugar de esta vista de detalle, nos va a resolver eso. Se va a decir, oh, sé exactamente lo que estás buscando. Ahora por defecto, si puede encontrar lo que buscas en tu contexto, ¿cómo llamaríamos a esto? Porque antes lo llamábamos como posts o lo mío, necesitamos llamar algo a esto. Y así vamos a seguir adelante y probar objeto. Y nos da el objeto. Y de hecho en realidad lo que esto está haciendo aquí, muy contento de que esto surgiera, es que me dio el texto. Y eso es porque si vamos a las modelos y nos dieron el post objeto, pero un dar a, nos dio la representación de cadena de esto, que es sólo self.TableView. Pero presumiblemente podríamos hacer texto de punto objeto o imagen de punto de objeto. Entonces vamos a hacer imagen de punto de objeto. De acuerdo, ese es el nombre de la imagen. Por lo que casi ahí. ¿ Y si hiciéramos image.All URL? Esa es nuestra URL, eso es lo que queremos. Entonces sigamos adelante y hachemos esto un poco. Entonces digamos texto h3, texto de punto objeto. Y vamos a hacer h3 imagen. Y esto simplemente va a ser una etiqueta de imagen, IMG SRC. Hagamos que esto sea un poco sensible. Agregará Bootstrap más adelante a esto con un auto de altura 100%. Y boom, ahí está. Mira esos sesgos QD. Y así ahora tenemos una vista de detalle. En la siguiente lección, lo que me gustaría hacer es que si nos limitamos a dar clic atrás, estos todavía no se pueden hacer clic. Por lo que tenemos que averiguar cómo hacer que se puedan hacer clic y, y a dónde ir. Porque podemos codificar esto. Podríamos en nuestro debido a, debido a hacer nuestro home.html, hacer de este un enlace que vaya a esmerar detalle slash post-doc ID si quisiéramos, porque sabemos que existe columna ID, hay una mejor manera de vivir tu vida sin embargo. Y que si alguna vez lo cambiamos de detalle a detalles o imagen o algún otro prefijo en nuestra URL aquí. ¿ Y si quisiéramos cambiar eso? Bueno, entonces tendríamos que cambiarlo en su casa. Y lo que te voy a mostrar una manera de que no tengamos que hacer eso. Básicamente podemos decir,
oye, Django, manejar esto por nosotros. Y si cambia en el futuro, también cámbialo aquí para nosotros. Entonces eso es lo que viene en la siguiente lección.
16. Enlace a la plantilla: Muy bien, echemos un vistazo a hacer que estos se puedan hacer clic y a otra página. Entonces, en primer lugar, vamos a cerrar detalle, vistas y URLs y modelos. Sólo necesitamos trabajar con nuestro home.html. Para esta lección en particular, necesitamos crear algún tipo de enlace. Y así lo que podríamos hacer es un HREF Ver Detalles. Y luego aquí podemos decir ir a slash detalles slash post dot id con una slash. Y cuando hago clic en este o c, Esta es exactamente la razón por la que no hacemos esto. No son detalles. Te guardo en eso su detalle. Refrescar. Ir a detalles. Está bien. Eso funciona. Y eso funciona. ¿ Y si por alguna razón lo cambié de detalles a info? De acuerdo, entonces voy a volver a mi página de inicio ahora, refrescar. Mi página ya no va a funcionar para mí. Y puedes ver que me da un fluoróforo. Entonces algo se rompió. Ahora hay una forma más agradable de hacer esto. Le dimos un nombre a esto y aquí hay este espacio de nombres. Y en ese espacio de nombres también coincide. Dónde estamos podríamos citar URL que el espacio de nombres coincide aquí. Entonces podemos decir en nuestro home.html, podemos decir, hey Django, ejecutar la función llamada URL. Entonces busca nuestro feed, ese es nuestro espacio de nombres y nuestra vista de detalle. Y eso lo estoy obteniendo del espacio de nombres, ese es nuestro nombre de aplicación, vista de detalle, ese es nuestro nombre. Y luego se necesita un entero. Y así como una cadena con citas o apóstrofes a su alrededor. Y luego fuera de esa cuerda, simplemente
digo post.TODO ED. Y probemos esto. Si hago clic en esto, va a detalle slash seis. Volvamos a nuestras URL y cambiemos esto a info. Refresca, espera a que Django reinicie. Refresca eso. Vuelve a hacer clic en esto. Y puedes ver mis enlaces cambiados y la URL va a info slash seis. Y automáticamente lo genera para todas estas imágenes para nosotros porque está en un bucle for. Entonces ahora solo voy a deshacer eso porque me gusta que me llamen detalle. Pero ahora no tenemos que preocuparnos por como URLs hardcoding, lo cual es realmente, realmente bonito. Vamos a seguir adelante y hacer que todo esto sea clicable. Hagámoslo. Slash a. Y debido a que esto tiene algunas cosas en ella, hagamos estilo, display, inline, block. Y ahora todo esto va a ser clicable. Por lo que ahora podemos ir a ver barranco, Mira este pastel de cutie. Una especie de gordita, algo lindo, esta tarta de cutie. Y podemos volver aquí. Ahora, y si estuviéramos haciendo algún tipo de aplicación, como, casi como una aplicación móvil. Y queríamos enlazar aquí arriba que dice volver atrás. Podríamos lanzar eso en nuestra página de Detalle también. Entonces vamos a abrir nuestro detallado punto HTML y cuerpo interno. Añadamos un enlace, un HREF. Vuelve atrás, corta un, y vamos a añadir una flecha, una flecha izquierda. Y aquí podemos simplemente decir corsé rizado, signo
por ciento, URL, alimentación. Y creo que lo llamamos índice. Vamos a volver a comprobar en sólo un segundo. Feed también coincide con el espacio de nombres aquí, así que estamos usando feed aquí y luego hacemos el índice Doo-doo-doo-doo. Ahora esto no tiene ningún tipo de parámetros en la URL, por lo que no tenemos que preocuparnos por pasar ningún parámetro. A diferencia de cuando usamos la vista de detalle de post, dijimos usar feed colon detalle. Y luego pasamos en un parámetro. Este no tiene un parámetro. Esta es solo la página de inicio. No hay parámetros para pasar. Y así usamos índice de colon feed para seguir adelante y refrescar nuestra página. Y dice Regresar y nos va a llevar de vuelta a nuestra página de inicio. Simplemente va a seguir trabajando para nosotros. Sólo sigue trabajando. Y así es como agregamos URL. En nuestra siguiente lección. Sigamos adelante y agreguemos un formulario para que alguien pueda subir una imagen por su cuenta. Y no tienen que tener acceso de administrador. Para que cualquiera pueda visitar su sitio web y subir una imagen por su cuenta.
17. Añadir un formulario de carga: De acuerdo, tengamos una conversación en torno a esta idea de las formas. Entonces si vienes de como un fondo Node.js, puedes o no usar formularios reales, pero es la forma correcta de usar cualquier tipo de formulario donde subas datos o guardas algo es usar realmente un elemento de formulario esa es la forma correcta y esa es la forma en que todos deberíamos estar haciéndolo. nuevas aplicaciones web progresivas y las aplicaciones de una sola página suelen saltarse todo este proceso. Nosotros no hacemos eso. Y eso también mantiene nuestra forma agradable y accesible. Entonces si alguien no está ejecutando JavaScript o usando un navegador antiguo, todavía va a funcionar para ellos. Entonces en mi opinión, esta es una especie de la mejor manera de hacerlo. Siempre puedes más tarde JavaScript encima de él para hacerte forma realmente elegante también. Pero por ahora, sólo tomemos una forma regular. Lo primero es lo primero en nuestro feed, vamos a seguir adelante y crear un nuevo archivo llamado foros dot pi. Aquí tenemos que hacer desde Django formularios de importación. Ahora esto se va a ver mucho de Django DB modelos importantes, clase algo modelos modelo punto. Echa un vistazo a esto. Formulario de puesto de clase. Así lo vamos a llamar, formas, forma de puntos. Y eso es casi todo lo que tenemos que hacer para crear una forma. Ahora podemos darle algún tipo de parámetro, no
son parámetro sino un campo. ¿ Qué tipo de cosas queremos mostrar en este formulario? Y lo hacemos con texto como es igual a foros punto char campo. Y a diferencia de nuestros modelos donde hacemos modelos punto char campo, hacemos formas punto char campo. También vamos a añadir una imagen en su imagen es igual a formas punto campo archivo. Vamos a subir un archivo, sea lo que sea, sólo vamos a subirlo. No nos vamos a preocupar demasiado por la validación de imágenes ni nada por el estilo. Simplemente vamos a subir una imagen o subir
un archivo y esperamos que como imagen porque esto es un curso de jangle uno a uno, no
nos estamos metiendo en la tontería y complejidades de Django. Simplemente queremos algo básico que funcione, que nos dé un poco de experiencia. Por lo que tenemos formularios dot pi con un formulario de post aquí. Abramos nuestras URL dot py, y vamos a crear un nuevo camino. Y esto va a crear una nueva página para nosotros donde alguien pueda realmente publicar una imagen. Y llamémoslo Post. Y entonces necesita renderizar de vista. Y ese nombre va a ser, y esto se llama add. Vamos a añadir una imagen o no, vamos a quedarnos con post. Van a publicar una nueva imagen. Ahora necesita renderizar una nueva vista. ¿ De dónde vamos a sacar esto? Vamos a crearlo. Entonces lo primero es lo primero, vamos, vamos a nombrarlo aquí. Agregar vista de publicación, punto-punto-punto como vista. Vamos a usar una vista basada en clases para esto. Y vamos a importar esa vista Agregar Post. Y cuando le pegue a Save, vas a ver que Django tiene un poco de enloquecer. Sí. No se puede importar Agregar vista Post, yada, yada, yada. Sabemos que aún no existe. Jangled, gracias por hacernos saber. Entonces, entremos a nuestros puntos de vista y creemos uno nuevo aquí. Ahora, queremos importar. A Form View. Y lo que esto va a hacer es que esto nos
permite publicar en nuestra página para realmente subir cosas. Entonces sigamos adelante y creemos esta nueva vista. Clase, Agregar vista Post. Va a ser una Vista de Formulario. Ahora, ¿qué viene en una vista de formulario? No lo sabemos. Entonces volvamos a CC-BY v Volvamos a la página principal. ¿ Y dónde está nuestra vista de forma? Ahí mismo, vista de forma genérica. Y así esto toma un nombre de plantilla también. Esto toma una clase de formulario. ¿ Dónde estás? Forma clase? Y bonita. Y creo que siempre lo va a buscar es una URL de éxito. Entonces, cuando el formulario sea enviado con éxito, digamos que no hubo ningún error en él. Digamos que se presentó con éxito. ¿ A dónde se supone que vaya? Y también hay un método aquí dentro con el que realmente queremos trabajar, y esa es nuestra forma válida. Si este formulario es válido, qué va a hacer nos va a dar una respuesta HTTP redireccionamiento a la URL get success. Sólo sigamos esto. Obtiene URL de acceso. Si no hay una URL de éxito, que vamos a establecer, pero si no hubo una, va a decir mal configurada, lo contrario, va a devolver esa URL de éxito. Entonces vamos a configurar primero nuestro punto de vista. Tenemos que darle un nombre de plantilla y llamémoslo nuevo post.html. Necesitamos una clase de formulario y eso va a ser algo que aún no estamos seguros. Y un éxito. Url, al menos S URL de acceso. Y vamos a hacer que vuelva a la página de inicio. Ahora esa clase de forma, ¿qué va a ser esto? Esta clase de formulario va a ser formulario de correo. Y así tenemos que hacer desde el formulario de entrada de importación del formulario DOT. Desplácese de nuevo hasta la parte superior desde formularios formulario de publicación de importación. Y podemos cambiar esto aquí abajo para publicar también formulario. Y mira eso. Django ya no se queja. Si, si, si, si,
si, si volvemos aquí y vamos a ¿Qué fue esa URL slash post. En la actualidad, la plantilla no existe. Nos hemos ocupado de esto dos veces. Ahora. Sabemos cómo lidiar con esto. Simplemente necesitamos hacerla existir. Entonces lo que voy a hacer aquí no es detalle base. Simplemente voy a guardar esto como nuevo post.html y simplemente sobrescribir el contenido aquí. Subir una nueva imagen va a ser el título y el cuerpo va a ser nada todavía. Sólo se va a decir vacío. Boom, así como eso. Entonces ahora estamos haciendo vistas con bastante rapidez. Ahora tenemos que realmente renderizar esta opinión de alguna manera. Tenemos que hacerlo, no tenemos la vista, sino la forma. Tenemos que hacer que este formulario en realidad se presente. Entonces vamos a deshacernos de la base, vamos a deshacernos de los modelos. Tenemos esta Vista Agregar Post. ¿Qué podemos hacer? ¿ Qué nos dice el CCB V? Vamos a entrar en obtener datos de contexto para mixin. Y si leemos este derecho, si la forma no en quarks, entonces la forma quarks es igual para obtener forma. Entonces sabemos que esto no es un contexto. Podemos escribir forma en nuestra página. Sigamos adelante y escribamos forma justo en nuestra plantilla. Veamos qué hace esto. Forma. Oye, mira eso. Eso no está nada mal. Y hay algunas maneras diferentes que podemos hacer. Podemos hacer forma dot ASU L. Y si hacemos clic derecho e inspeccionamos, nos da que, bueno, esta es una mesa así como p, mejor. Tan tabla como UL. Ahí vamos. Como bien ustedes, no sé por qué apareció como mesa esa primera vez. Eso fue un poco bizarro. Creo que eso podría haber sido un viejo código fuente que estábamos mirando. Pero como UL va a crear una lista, y vamos a echar un vistazo a esto. Ahora tenemos un formulario. Ahora esto no va a hacer nada. Si entro aquí y le pego Enter, No hay forma. Y si revisamos este código fuente, sólo
tenemos aliados aquí. Y en realidad lo que voy a hacer es que voy a usar como p x No quiero tratar con listas todavía. Y así simplemente los pone en una nueva línea. Enfriar, fresco, fresco. Pero necesitamos agregar un formulario HTML real aquí. Por lo que Django nos deja controlar dejando, simplemente dándonos el interior de la forma. Podemos escribir lo que queramos en el exterior del formulario. Por lo que el método for va a ser post y la acción va a ser su propia página. Entonces vamos a crear un nuevo div aquí con un botón. Y el tipo va a ser no botón, pero va a ser Enviar. Enviar formulario, formulario de corte. Echemos un vistazo a esto. Deshacernos de esa página. Echa un vistazo a esto. Tenemos una presentación y vamos a probar esto. Y les voy a mostrar que esto realmente va a fallar. En primer lugar, está buscando esta cosa llamada token CSRF. Y este es un token de falsificación de solicitud de sitio cruzado. Y básicamente esto asegúrate de que las personas estén enviando el formulario desde tu página web. Y agregamos uno de estos muy fácilmente haciendo corsé rizado, signo de
porcentaje, CSRF, token de subrayado. Sigamos adelante y intentemos esto de nuevo y actualicemos la página. Bla, bla, bla, bla, bla. Y la imagen aquí dentro. Y vamos a ver que esto también falla. Dice que se requiere este campo. Adelante en otra imagen. Dice que se requiere este campo. Otra vez. ¿Qué está pasando aquí? Estamos agregando eso ahí dentro. Ahora aquí la cosa es que cuando subes imágenes o archivos de cualquier tipo, cualquier tipo en un formulario, necesitas esta cosa llamada tipo tinta. Y hacemos datos de forma de slash multiparte. Y esto nos permite realmente enviar archivos desde nuestro navegador al servidor. Sigamos adelante y guardemos esta actualización. Oh, no queremos hacer eso. Queremos hacer una dura actualización. Esta es una nueva foto. Sigamos adelante y guardemos esto o no guardemos esto, pero añadamos eso. Escaneo esta imagen aquí. De acuerdo, un set me regreso a la página principal. Esa fue la solicitud o la solicitud, pero esa fue la URL de éxito que escribimos que vino, ¿de dónde estamos aquí? El URL de éxito volvió directamente a su casa. Ahora si volvemos a nuestro administrador aquí, vamos a revisar nuestros mensajes. Are post aún no existe. Necesitamos agregar un formulario válido publicado aquí y crear un nuevo post con los datos. Por lo que tenemos este método llamado def form válido. Toma auto y forma. Volvamos a CC-BY V y Formulario válido aquí mismo. ¿ Y qué va a hacer esto? Esto va a devolver un redireccionamiento de respuesta HTTP a la URL de éxito. Entonces, a diferencia de nuestros datos de contexto donde hicimos contexto es igual a super. Y luego un montón de otras cosas no vamos a hacer eso. Vamos a hacer formulario de devolución super punto válido con un formulario ahí dentro. Y hagamos esa minúscula. Y entonces podemos decir aquí, imprimir, esto era válido. Y vamos igual que el spam o terminal con esto. Y vamos a seguir adelante y volver a slash post nueva imagen. Y de nuevo, esto no va a ahorrar todavía. Y lo hay, hay una manera más fácil de hacer esto. Podríamos usar una forma modelo si quisiéramos. No vamos a hacer eso todavía. Vamos a, vamos a mantenerlo sencillo con una forma regular. Entonces sigamos adelante y presentemos esto. Y vamos a ver que nuestra terminal tiene un poco de ataque de espouse. Dice que esto fue válido una y otra vez. El formulario en sí era válido. Ahora si queremos los datos del formulario, siempre
podemos hacer imprimir formulario dot datos limpiados,
esos son los datos validados. Entonces si alguien intentó escribir HTML o JavaScript o algo ahí dentro, lo va a limpiar para nosotros, lo cual es realmente agradable. Django sólo maneja eso por nosotros. Texto. Podríamos simplemente imprimir eso unas cuantas veces. Volvamos a slash post agregará una URL para esto muy pronto. Este es mi texto donde el corazón. Y parece que no hizo nada pero dice que este es mi texto con el corazón. Y así ahora lo que podemos hacer porque esta forma está limpia, sabemos que la forma dot limpió los textos con texto como clave de diccionario imprime el texto que estaba en el formulario. Presumiblemente la imagen también va a funcionar. Entonces si volvemos a formularios, tenemos texto es igual a foros punto char campo, y la imagen es igual a formas como campo de archivo. Vamos a seguir adelante y crear un nuevo post. Por lo que necesitamos crear un nuevo post. Ahora antes de hacer eso, tenemos que hacer que su puesto sea de hecho importado, que es. Y entonces podemos decir el nuevo objeto porque todo es un objeto es igual a post.All objects dot create. Y si echamos un vistazo a nuestros modelos, es buscar texto como palabra clave e imagen como palabra clave. Por lo que ahora podemos decir que el texto es igual a formas dot texto de datos limpiado. Y la imagen es igual a formas dot imagen de datos limpia. Y luego cuando esté hecho, cuando haya terminado de guardar esto, nos
va a enviar de vuelta a la página de inicio. Vamos a ver si cometí algún error aquí. Slash post. Esta es mi imagen más reciente. Y que deja hacer amigos Lego set. Y dice, oh, los nombres forman no encontrar bien, eso porque donde tú, no
es forma su forma. Y la razón de que es forma es porque se pasa aquí como la palabra forma, como la forma argumental. Adelante y prueba eso una vez más. Y una cosita agradable que podemos hacer aquí es que si ves algo como esto, solo
puedes refrescar tu página. Y va a decir, oye, porque este era un método de post. ¿ Quieres volver a intentarlo? Vamos a decir que sí, inténtalo de nuevo. Desplázate hacia abajo. Y esta es mi imagen más nueva. Este es mi set de Lego que hice el fin de semana pasado. Pondremos unos amigos. último, pero no menos importante, necesitamos agregar un enlace a esta vista real. De lo contrario, la gente no va a saber que esto existe. Entonces vamos a nuestra vista de casa y vamos a añadir un enlace. Un href es igual para agregar un nuevo post. Y hagamos una flecha a la derecha. Y esto va a ir a las publicaciones de alimentación de URL. Y de donde estoy sacando eso es de nuevo, feed, ese es el nombre de la aplicación, ese es el espacio de nombres que estamos usando y la publicación de nombres. Por lo que siempre es dos puntos de espacio de nombres, el nombre de la vista. Tres frescos. Ah, eso se ve un poco grosero. Añadamos aquí una RRHH. Tan sólo una regla horizontal. Ahí vamos. Agregar nueva publicación. Podemos añadir un nuevo post. Fresco, cool, cool, cool, cool, cool, cool. Y vamos a añadir de nuevo el vientre de la galera. Desplázate hacia abajo y vemos a Cuckoo, cuco que va con barrancos vientre ahí dentro. Está bien, eso es fantástico. Esto en realidad está funcionando ahora. lo que respecta a esta lección, ésta está completa. En la siguiente lección sin embargo, hagamos que las publicaciones más recientes aparezcan en la parte superior.
18. Ordenar las publicaciones predeterminadas: Muy bien, hagamos que las publicaciones más nuevas aparezcan en la parte superior de aquí. Y así este es el post más antiguo, segundo más antiguo, el tercero más antiguo. Se puede ver incluso que ahí nombrado primero, segundo, tercero. Esta es la imagen más nueva, cuco cool. Ese es el que agregamos en el último video. Vamos a revertir esto. Entonces, vamos a entrar en nuestros puntos de vista aquí. Cerremos todas esas cosas y finjamos que estamos empezando desde la alimentación de cero. Tenemos que entrar en nuestros puntos de vista. Necesitamos ver nuestra vista de página de inicio. Y básicamente estábamos recorriendo todos nuestros posts, todos los posts disponibles en nuestra app. Y así estamos diciendo post.Todos los objetos puntos todos, eso va a conseguir todos los objetos. Y entonces podemos decir punto orden subrayado por, y podemos ordenarlo por textos o alguna otra forma. Y así podemos ordenarlo por su texto u ordenados por su texto descendente. O podríamos ordenarlo por su ID, que es lo que está haciendo por defecto, o su ID descendente. Y cuando golpee refrescar aquí, vamos a ver que este orden aquí se voltea. Se va a revertir por completo así como así. Y simplemente pasó a ser la primera y última imagen son exactamente iguales. Pero éste fue el más nuevo. Este es el segundo más nuevo, 1 tercero más nuevo, 1, cuarto más nuevo y el más antiguo. Y así todo lo que hicimos ahí fue que dijimos, oye Django, consigue todos los objetos postales, llévalos todos, y luego ordenarlos por el DNI. Y sabemos que tiene identificación. Cada modelo tiene un ID por defecto. Y es incluso migración interna aquí, se llama orden ID por ID descendente con un signo menos. Si dijimos esto, esto es lo que está haciendo por defecto y va a pedir 12345678910. Si lo hacemos descendiendo, esto va a ir 10987654321. Y eso es todo lo que tenemos que hacer. A continuación, echemos un vistazo a cómo podemos agregar algún tipo de mensaje a nuestra página cuando se sube una nueva imagen. Porque cuando subimos una nueva imagen, eso sólo nos trae de vuelta a esta página y en realidad no sabemos si ha pasado algo. O sea, supongo que podríamos ver que esta es una nueva imagen y vamos a seleccionar la imagen de ellas, Katlyn. Y aparece en la parte superior para que podamos ver que está funcionando ahí. Pero, ¿y si tienes muchos usuarios usando esto? Es posible que en realidad no puedas ver primero tu imagen. Alguien podría haberse presentado un milisegundo después, y va a demostrar que 1 primero y el tuyo podrían perderse en alguna parte. Queremos mostrar un mensaje. En la siguiente lección, vamos a hablar de mensajes de jangle.
19. Marco de mensajes de Django: De acuerdo, hablemos de los mensajes de Django. Entonces un mensaje es básicamente una forma de enviar un poco de información de una página a otra, pero sólo lo hace una vez. Entonces si estás familiarizado con la idea de las sesiones, básicamente crea una sesión y una vez que se accede a esa sesión, la elimina. Y así queremos agregar un pequeño mensaje y una pequeña sesión. Y cuando alguien llene este formulario y lo lleve de vuelta a esta página, debería decir, Hey, agregaste con éxito una imagen. Y esto es realmente, realmente fácil de hacer en esto viene al horno con Django tres automáticamente. Así que abramos a nuestro editor aquí, y abramos Feed views dot py. Y primero lo primero, sigamos adelante e importemos. Fuimos a debido de go dot contrib, creo con mensajes de importación de trPb. Ahora si estás aprendiendo Django y estás trabajando con un proyecto de Django existente, tienes que entrar en tu configuración y asegurarte de que los mensajes estén ahí dentro. Entonces si abrimos nuestra configuración y escribimos mensajes, los mensajes contrato de
Django está en aplicaciones R instaladas, está en nuestro middleware, y también está en nuestros procesadores de contextos de plantilla, lo
que significa que se puede agregar a cada plantilla única. No importa cuál sea tu plantilla, solo se puede agregar automáticamente. Y así debes asegurarte de tener esos ahí dentro. Entonces por ahora vamos a hacer desde Django.com viaje mensajes importantes, desplácese hacia abajo hasta nuestro formulario. Y cuando se cree ese nuevo objeto, agreguemos un nuevo mensaje. Y así podemos agregar un nuevo mensaje con mensaje dot add message. Toma una solicitud por defecto. Hagamos mensajes puntan éxito. Hay diferentes tipos. Echaremos un vistazo en solo un momento en los muelles, tu post fue exitoso. Y vamos a escribir en Django mensajes docks, el marco de mensajes. Y así nos dice que necesitamos tener todas estas cosas configuradas en nuestro middleware aplicaciones instaladas, proceso de
contacto, contextos, procesadores, etcétera,
etcétera , fondos de almacenamiento, niveles de mensajes. Ok, entonces aquí es donde obtuve mensajes, punto éxito y no son mensajes. Son mensajes, eso es lo que importé. Mensajes, punto agregar mensaje, mensajes, punto al éxito. Y aquí es de donde obtuve el éxito. Entonces si fue exitoso, voy a dar un mensaje de éxito y esto va a ser accesible en nuestra plantilla. Si hubiera una info uno podríamos usar mensajes dot info, debug, warning o error. Por lo que tenemos estas cinco opciones. Voy a ir con éxito porque sé que eso va a funcionar bien con Bootstrap. Porque Bootstrap suele tener como, creo que es éxito B G dash o text dot dash success, algo así. Entonces sé que creo que en realidad todos estos podrían funcionar excepto depuración. Pero quiero este exceso de color uno por el camino. Y sí, si bajamos a las etiquetas de mensajes, eso nos dice en realidad. El éxito nos va a dar el éxito de la etiqueta, y eso se va a poner en nuestro atributo HTML, CSS, nuestro atributo de clase. Y entonces cómo hacemos esto? Dice agregar un mensaje. Entonces importamos nuestro mensaje, ya lo hicimos. Mensajes punto agregar mensaje. Toma la solicitud como su primer parámetro. Un tipo de mensaje es que info success, debug, error, etcétera, y luego el mensaje en sí. Y así aquí hay algunos ejemplos diferentes. Y cuando queremos mostrar mensajes, simplemente
podemos copiar y pegar esto. Hagámoslo. Por lo pronto, esto va a estar bien. Podemos limpiar esto un poco más tarde. Entonces, vamos a guardar esto. Y vamos a entrar en plantillas basadas en HTML. Está cerca esa base de datos uno. Y porque esto es accesible en cada plantilla, porque está en un procesador de contexto, lo que significa que es accesible. Y cada plantilla ahora podemos decir, si hay mensajes, crea una lista, una lista desordenada, y luego recorre cada mensaje con un LI y dice si hay etiquetas de mensaje, agrega las etiquetas aquí, eso va a ser esto acceder o depurar. ¿ O cuáles eran los otros? Info éxito, error de advertencia y depuración. Y si, y luego el mensaje en sí. Por lo que va a recorrer todos ellos. Y podemos tener múltiples mensajes que es importante saber y por eso estamos recorriendo estos. Ahora, vamos a seguir adelante y darle una oportunidad a esto. Y les voy a mostrar que esto en realidad tiene alguna forma de error. Esto no va a funcionar. Y solo seleccionaré cualquier imagen. Y dice: Oh, error de nombre, solicitud de
nombre no está definida. Ahora aquí está lo complicado, y vas a querer tomar nota de esto porque seguir adelante, esto va a ser un salvavidas. Por lo que el primer parámetro en el mensaje de anuncio es solicitud. Si volvemos a nuestro código aquí en forma válida, no
tenemos solicitud, nos tenemos yo y nos hemos formado. Entonces, ¿cómo obtenemos las solicitudes? Estamos en una Vista de Formulario aquí. Echemos un vistazo a donde existe Solicitud. Obtiene cuando se obtiene el formulario. Por lo que cuando estás mostrando el formulario, podrías acceder a la solicitud, su método HTTP de despacho no permitía opciones de publicación y configuración. Y entonces lo que queremos aquí es que realmente queremos despacho. Entonces cuando se está despachando esta vista, cuando está siendo, cuando está a punto de ser renderizada, ¿qué va a hacer? Y así vamos a seguir adelante y sólo copiar esta línea. Y debido a que tiene solicitudes aquí, pero nuestro método en aquí forma válida no tiene solicitudes, pero podemos hacer es sordos despachados auto solicitud args, quarks. Literalmente solo copio eso desde aquí. Def despachó auto solicitud args, quarks, devolución super dot despacho solicitud args y quarks. Y así literalmente en este punto del tiempo estamos diciendo, oye, Django, Sabemos que tienes un método de despacho. Yo solo quiero que sepas que quiero que uses ese método de despacho. Honestamente, esto no tiene sentido, pero se vuelve menos inútil cuando hacemos esta solicitud de
self.age es igual a ese objeto de solicitud. Y debido a que estábamos en una clase, podemos usar la solicitud de self.age en cualquier otro lugar. Por lo que ahora podemos escribir self.age request aquí porque se está accediendo aquí. El despacho se ejecuta antes de que el formulario válido lo haga. Entonces nos va a fijar esto y luego podremos acceder a la solicitud de autof.age por el camino. Adelante y probemos esto. Vamos a refrescar esta página. Generar un nuevo mensaje. Y voy a agarrar cualquier imagen. Realmente no importa. Y dice que tu posteado fue exitoso. Y eso viene de nuestro punto base HTML. Está en una lista desordenada. Y vamos a hacer clic con el botón derecho e inspeccionemos esto. Tenemos una URL con una clase de mensajes, tenemos una LI con una clase de éxito y en ella tiene tu post fue exitoso. Tenemos una clase UL de mensajes. Se va a recorrer cada mensaje. Tenemos un LI con etiqueta de mensaje, etiquetas de punto de mensaje. Ese fue el éxito que viene de aquí. Y entonces el mensaje en sí es que tu post fue exitoso. Dice el mensaje ahí dentro. Y eso es todo lo que hay para agregar mensajes. Entonces realmente todo lo que necesitamos hacer es escribir mensajes, punto agregar mensaje. Toma una solicitud, tiene
que tomar ese objeto de solicitud exacta. Se necesita algún tipo de mensaje o una etiqueta. Entonces estamos diciendo mensajes, puntos, acceso porque esto fue exitoso. Y luego nuestro mensaje en sí en nuestra plantilla base porque queremos que esto aparezca en cualquier página. No importa dónde queramos que aparezca en cualquier página. Vamos a decir si hay mensajes, cuco, cuco,
cool, bucle a través de esos mensajes y mostrarlos. Ahora mira esto cuando vuelvo aquí y refresca página, ese mensaje desaparece, es muy temporal. Sólo existe una vez.
20. Agregar Bootstrap 5: De acuerdo, vamos a añadir un tema de front-end. Y para esto vamos a estar usando Bootstrap cinco. Entonces vamos a ir a getbootstrap.com. Y vamos a usar lo que voy a estar usando cinco versión cinco beta uno. A lo mejor para el momento en que estás viendo esto estaban en una versión diferente. Eso es genial. Y realmente no importa. Sólo empecemos. Necesitamos este CSS. Sigamos adelante y copiemos esto. Esto viene de una red de entrega de contenidos. Todavía no necesitamos el JavaScript. Es decir, si quieres, puedes agregarlo, pero simplemente vamos a añadir el CSS y queremos añadir el CSS en cada página. Entonces lo que vamos a hacer es simplemente pegarlo aquí. Y eso lo va a agregar a cada página. Y por eso tenemos este punto base HTML. Se lo va a agregar a nuestra página de detalles, nuestra página de inicio y nuestra nueva página de publicaciones, y ver esto. Cuando me refresque, vas a ver que se ve un poco diferente. Sólo un poco diferente. Oye, sólo una especie de restablece las cosas para nosotros. Ahora sigamos adelante y agreguemos una barra de navegación. Y vamos, creo que está en componentes. Lo vamos a encontrar navbar. Y encontremos uno que nos guste y solo copiemos eso. Siempre podemos modificar el HTML más adelante. ¿ Cuál queremos? ¿ Hay uno simple? Y éste es bastante sencillo. Esta es una buena. Por lo que tenemos como un título como sharer de imágenes, nuestra página de inicio, adipocitos. Y eso es en realidad todo lo que necesitamos. Sigamos adelante y copiemos esto. Y como queremos esto en cada página, vamos a lanzar este HTML de punto base interno. Ahora me voy a deshacer de algunas cosas aquí justo del bate. Navbar, no quiero que eso se llame navbar. Yo quiero que esto se llame sharer de imágenes porque eso es lo que creamos y eso sólo va a ir a la página de inicio. Por lo que sólo va directo a rebanar. No necesita una URL especial. Porque slash es siempre la página de inicio de un sitio web. Podemos ir a casa. Y de nuevo, eso es solo porque la forma en que tenemos la configuración es que podríamos usar slash o podemos usar URL, feed index. Y de nuevo, de donde eso viene es si cierro vistas dot py, vaya a URLs dot py, feed index. Eso nos va a dar una barra, igual que aquí arriba. Simplemente sucede que es que tiene prefijo capaz. Si queríamos que la página de inicio fuera algo así como slash home, eso cambiará automáticamente para nosotros. Características. No queremos precios y no queremos discapacitados. Y en lugar de características, llamemos a esto agregar nueva imagen. Y necesitamos vincular esto a nuestra publicación de Feed. Y de donde eso viene es feed post. Y eso va a ir a esta URL aquí. Adelante y veamos cómo se ve esto. A lo mejor esto se ve terrible. No estoy realmente seguro. Tengo miradas. De acuerdo, puedo vivir con eso. Supongo que nos hace en realidad un 100%. Eso es, eso no está mal. Yo puedo vivir con eso. Ahora sigamos adelante y le enviemos aquí parte de nuestro contenido. Y vamos a decir HTML de punto base interno. Y quizá limpiemos esto primero. Soy un stickler para buen código limpio. De acuerdo, así que solo limpio eso. Y queremos centrar todo nuestro contenido. Así que echemos un vistazo a los contenedores en Bootstrap cinco contenedores de diseño de contenido personalizado. Y eso es exactamente lo que queremos. Queremos contener o tal vez queremos un contenedor de tamaño regular. Y así sucesivamente. Una pantalla extra grande va a tener 1320 píxeles de ancho. En un, eso es un extra, extra grande. No me había dado cuenta de que hacían eso. Ahora hay un extra grande para ello a 1140. Grande es nueve sesenta y siete, veinticinco cuarenta. Cualquier cosa por debajo de eso es un 100%. Usemos un comentarista. Y veamos qué hace esto. Enfriar. Por lo que ese tipo de lo centraba para nosotros. Eso es bueno. Vamos, vamos a deshacernos de este enlace porque ya tenemos eso ahí dentro. ¿ Y de dónde salió eso? Eso vino de nuestra casa, creo. Sí, ahí mismo. Adelante y deshacernos de eso. Hermosa. Y lo que podemos hacer es que este nav en realidad está ocupando mucho espacio. Entonces lo que podemos decir aquí es incluir, incluye barra inclinada, navbar index.html. Y sigamos adelante y copiemos todo esto, no copiar sino cortar. Vamos a ir a cortar. Y esto va a mirar en nuestra carpeta de plantillas para una subcarpeta llamada incluye, y luego un archivo llamado navbar dot HTML. Hagámoslo. Nuevo archivo incluye barra inclinada, nope, incluye deletrearlo a la derecha, barra inclinada, barra de
navegación punto HTML pegar. Y ahora se basan en HTML. Se ve bien y limpio de nuevo, vamos a asegurarnos de que eso esté funcionando. Eso es de hecho belleza trabajadora, belleza, belleza. ¿ Qué más queremos hacer aquí? Hagamos estas tarjetas o algo así. Entonces, ¿qué es lo que queremos aquí? Creo que eso se llama componente en Bootstrap. Es una tarjeta. Sí, esto es exactamente lo que queríamos. Queremos una imagen con algún texto y luego un enlace para ver toda la imagen. Sigamos adelante y copiemos esto. Y vamos a lanzar este for-loop interno en nuestra página de inicio. Nuestra página de inicio. Adelante y deshacernos de eso. Vamos a deshacernos de eso. Y solo hagamos un poco de espacio para trabajar. Y solo queremos reemplazar, ya sabes, como la imagen SRC con esta imagen de aquí, o este texto con texto postdoc. Entonces, en realidad sigamos adelante y empecemos a hacer alguna cirugía. Sigamos adelante y cortemos eso y ponerlo justo en nuestro párrafo, y ese va a ser nuestro texto. No necesitamos un título de tarjeta. Si lo quisieras, podrías extender tu modelo para tener un título. Por lo que cada imagen podría tener un título. Ve a algún sitio. ¿A dónde va a ir esto? Y ese va a ser este enlace aquí. Y en lugar de decir, ir a alguna parte, Hagamos que el texto diga ver imagen completa. Y luego necesitamos mover esta cosa de miniaturas hacia abajo y mover eso. Y mueve eso hacia arriba. Y lo que necesitamos es esa URL de imagen. Por lo que agarramos esa URL de imagen. Y ese alt podría ser lo que te mandaré un mensaje de texto que quieras. Dónde vamos, vamos a tirar la imagen, ancho y altura. Y vamos a darle a esto una clase de cartulina de imagen superior, que ya venía con ella. Y entonces supongo donde lo estoy dando, ya
nos lo dieron. Y sigamos adelante y guardemos esto. Y vamos a deshacernos de esta vieja cosa de aquí arriba. Limpia esto,
hazlo agradable para que la gente con la que estás trabajando y no te odien por escribir código muy descuidado. ¿ De acuerdo? No está mal, no está mal. Todos estos están en su propia línea sin embargo. Eso no es exactamente lo que estamos buscando. Queremos que todos estos sean una columna. Entonces sigamos adelante y creemos una nueva fila. Y esto es sólo conocimiento del viejo Bootstrap. Creamos una fila, movemos ese div hacia abajo. Y luego por cada post queremos crear una nueva columna. Por lo que podríamos hacer columna SM. Cuando es pequeño. Tomemos hasta seis puntos col md para hit Tab m. automáticamente
hace el resto por mí. Oye, no está mal, no está mal. Podría ser mejor, pero eso no está mal. Y en realidad lo que debo hacer es echar un
vistazo al diseño aquí dentro y el horario del doc mirar a la cuadrícula. Entonces sí tenemos coalesce m Solo
queremos asegurarnos de que funcione igual en Bootstrap cinco ya que
no le gusta Bootstrap para Bootstrap tres, etcétera, etcétera. Porque podría haber escrito el nombre de clase equivocado. Ahí vamos. Ahí hay una columna de ejemplo, T2 grande. Eso es sólo una prueba de que lo que buscaba era lo correcto. Entonces en un medio, vamos, hagamos realmente tres. Hagamos esto un poco más pequeño. Ahí vamos. Y necesita un poco de espaciado por encima y por debajo de cada tarjeta. ¿ Y qué pasa si me deshago de esto? ¿ De acuerdo? Y funciona bien? Debajo de cada tarjeta, hagamos margen, cuatro inferiores. Pero hacer margen, arriba y abajo cuatro. Ahí vamos. Y mira esto. Tenemos una bonita galería de imágenes. Adelante y veamos esta imagen. De acuerdo, entonces, ya sabes, en la base se aplicaron cosas. Eso fue lindo. Adelante y limpiemos un poco esto. Entonces abramos nuestro detallado HTML de puntos. Y no necesitamos un enlace de retroceso porque eso está ahora en la barra de navegación, está en casa o agregar nueva imagen o el logotipo. Si había un logotipo, ya no necesitamos eso. El texto y la imagen es todo lo que necesitamos. Y sigamos adelante y hagamos que esto sea receptivo. Y no sé qué es eso en realidad en Bootstrap. Entonces hagamos una búsqueda de imágenes responsive. Y queremos clase fluida de imagen. Img fluido. ¿ De acuerdo? Está bien, no está mal. Podría ser mejor, creo. Veamos qué más podemos hacer. Tenemos imagen, miniatura, Cool. Rodeado. ¿Es eso lo que queremos? Sí. Sí. Sí, hagámoslo. Hagamos que la imagen sea redondeada. Se emocionó mucho por ese redondeado. Y eso sólo nos va a dar bonitas esquinas redondeadas. Sigamos adelante y quizá arrojemos esto a algún tipo de rho también. Rho con una llamada SM, digamos diez, tan pequeño y arriba va a ser un ancho de columna de diez. Mueve eso hacia arriba. Y creo que es carbón offset no offset SM One, supongo. ¿ Se lo ha ingresado. Y sigamos adelante y agreguemos un relleno al relleno superior, los cinco primeros. Eso sólo lo baches para nosotros. Y tal vez agreguemos relleno inferior cinco. Entonces a la izquierda y a la derecha podríamos hacer relleno X o en la parte superior e inferior podríamos hacer relleno y p, y cinco. Y parece que no hizo nada más que añadir relleno al fondo aquí abajo. último, pero no menos importante, tenemos nuestra página de publicaciones. Esta página se ve terrible. Adelante y arreglemos esto. También podría cerrar esos. Hagamos New Post y ese botón, cambiemos ese botón. Clase, btn, btn-éxito, supongo. Enfriar. Eso funcionó para mí. ¿ Qué tenemos para los formularios? De acuerdo, así que esto se mete directamente en ello. Y puede que en realidad no tengamos todo ese control. No lo hacemos, porque mucho de esto nos ha manejado dentro de Django. No tenemos acceso a, no fácil acceso a la etiqueta. En realidad no podemos obtener acceso a la etiqueta y recorrer todos los campos del formulario y crear un formulario por nosotros mismos. Es un poco más avanzado. Entonces no vamos a cubrir eso en Django 101. Pero lo que podemos hacer es si quisiéramos escribir algo de CSS, que no vamos a ir, pero si quisiéramos escribir algo de CSS, se podría decir todo dentro de tu formulario. Con un, digamos, un tipo de entrada de texto podría entonces ser este tipo de campo. Y puedes extenderlo usando SAS y cosas así. No vamos a meternos demasiado en eso. Hagamos que esta página se vea un poco más ordenada. Entonces agreguemos una clase aquí. Clase va a ser kohl S M para offset. Matemáticas rápidas aquí. Y 12 menos cuatro es ocho dividido por dos es cuatro. Entonces esto lo va a centrar porque hay 12 columnas en Bootstrap. Y agreguemos un título a un H dos y aquí, subamos una imagen. Y agreguemos un poco de relleno ahí también. Acolchado top cinco, margen superior e inferior cinco. Y en este punto realmente solo estoy experimentando para hacer que este luzca medio decente. Y lo que ese botón para ser más grande para btn dash LG. Ahí vamos. Ahora digamos que queremos reorganizar el texto y la imagen. Entonces alguien elige primero la imagen y luego califica el texto. Pasemos a nuestros foros dot pi. Y simplemente reorganizemos esto. Simplemente muevo esto hacia arriba y hacia abajo. Entonces el primero va a ser imagen y el segundo
va a ser gravado de manera segura para que Django se recargue. Refrescar. Y ahí está, imagen primero, texto después. Y digamos que no queríamos llamar a este texto porque vemos que aquí se llama texto e imagen, su imagen está bien. Creo que solo seguiré adelante y cambiaré esa etiqueta. Etiqueta va a ser descripción. Todavía va a ser texto en el código Python, en el código Django. Pero la etiqueta va a decir descripción en su lugar. Entonces en lugar de texto aquí mismo, va a decir carga común para mí. Descripción, clavado. Justo así. último pero no menos importante, cuando
subimos una imagen, tenemos mensajes, necesitamos mostrar un mensaje. Y así esto a menudo se pierde porque dice que si los mensajes luego hacen una cosa, lo que vamos a hacer aquí es en realidad vamos a diseñar esto fuera de la declaración if y luego envolver el código dentro de ella. Entonces volvamos a bootstrap y hagamos un color de fondo. Colores de fondo. Ooh, hagamos un gradiente. Eso me gusta. Y así podemos tener éxito de texto. ¿Quién miraría eso? Tenemos un montón de omega aquí. Bg éxito porque estamos usando el éxito para la información de mensajes también, islotes. ¿ Dónde está el gradiente? Sí, esto es lo que queremos, éxito de
BG y gradiente de BG. Entonces sigamos adelante y creemos una nueva barra aquí. Y vamos a tirar eso ahí dentro. Asegurémonos de que el texto esté centrado. Y el texto va a ser blanco para que podamos leerlo. Texto ficticio aquí. Vamos a ver cómo se ve esto. Oh, mira eso. Está por encima de f bar. Eso son dos alertando. Vamos a mover esa barra de navegación hacia arriba. Está bien, genial. Hola, agreguemos un poco de relleno. Acolchado, superior e inferior va a ser relleno eje y. Hagamos cuatro. De acuerdo, eso me gusta, puedo vivir con eso. Ahora tenemos que volver a mover esto a la declaración if. Y podemos hacer las etiquetas de mensajes. Va a estar aquí. Porque sabíamos que originalmente era en realidad éxito. Sólo lo vamos a tirar ahí dentro. Y luego vamos a envolver eso en una declaración if también. Al igual que esto. Y todo lo que estoy haciendo es un poco de cirugía HTML aquí. Y esa es una simple declaración if. Entonces podemos decir otra cosa como defecto, siempre volver a, en lugar de tal vez no le dimos un mensaje. Digamos que siempre tiene que volver al éxito por defecto. Entonces está diciendo aquí, si hay etiquetas de mensaje, imprima esas etiquetas de mensaje. De lo contrario, utilice el éxito. Y si necesitamos entonces mover este mensaje. Y otra vez, vestido haciendo algo de cirugía aquí, pega. Y por último para y luego abajo. Y ahí vamos. Entonces ahora esto dice, si hay mensajes para mensaje y mensajes, vamos a seguir adelante y darle estilo a un div, pero el mensaje dentro de él. Y agreguemos una nueva imagen. Y asegurémonos de que esto realmente funcione. Probando un mensaje de Django. Ahora tu post fue exitoso y debido a hacer, necesito mover esa copia de seguridad y eso luego se moverá de nuevo hacia abajo. Veamos un ejemplo más. Simplemente, solo para conducir realmente esta casa, solo para asegurarse de que el mensaje aparezca en sus dice que tu post fue exitoso. Ahora tenemos una cosa más que considerar. ¿ Y si tienes aquí una aplicación totalmente nueva y nadie la está usando? No hay imágenes. Sigamos adelante y eliminemos todas estas imágenes y entramos en publicaciones. Agarra a todos ellos. Eliminar, ir. Sí, elimínalos. No aparece nada. No se ve el más grande, ¿verdad? Lo que podemos hacer es en nuestra página de inicio, porque ahí es donde estamos buceando a través de todos nuestros posts en nuestro bucle for, podemos decir, si está vacío, cosas correctas aquí. Y dice escribir cosas aquí. Porque no hay nada ahí dentro. Sigamos adelante y agreguemos un poco de estilo aquí también. Por lo que ya estamos en una fila, solo
necesitamos agregar una columna. Por lo que carbón SM seis puntos offset tres. Hagamos que este texto centro y le demos un relleno superior e inferior de cinco, margen superior e inferior cinco también. Mucho espaciado. H2, párrafo bienvenido y párrafo. Agrega tu primera imagen y un botón, un HREF. Vamos a llenar eso en tan solo un segundo. Clase es igual a btn, btn, LG, BTN éxito. Porque vamos con el tema verde aquí. Subir Imagen. Y sólo necesitamos eso para ir realmente a algún sitio. Sabemos cómo hacer esta URL, string Feed,
post, subir una imagen que está subiendo nuestra primera imagen. Y hagámoslo también, porque es super lindo. Esto es galera. Ahí hay una hermosa imagen. Ahí está barranco, Estamos hechos nuestra app así como eso.
21. Tu proyecto: Está bien, bienvenido a tu proyecto. Acabamos de crear toda una app de Django desde cero en este curso en Django 101, lo que me gustaría que hicieras es si no has estado siguiendo, quiero que intentes recrear esta app desde cero. Se va a llevar un poco de investigación. Es posible que tengas que acceder a los docs de Django, tal vez
tengas que acceder a esta hermosa página web. En realidad no es hermoso, pero es muy, muy informativo. Es CC-BY v dot CIO dot UK. Muy, muy servicial. Podría tener que acceder a los docs bootstrap, podría tener que hacer poco de investigación. No va a ser súper fácil, pero va a ser una gran experiencia. O si quieres, no
tienes que hacerlo necesariamente desde cero. Puedes tomar todo mi código fuente. Siempre puedes descargar el código fuente también desde Github.com slash Caleb Talia slash Django dash, uno a uno. Asegúrate de seguir el Read Me. Voy a escribir un léame ahí dentro y luego sólo puedes seguir. Puedes clonarlo hasta tu computadora y configurarlo por tu cuenta, luego simplemente modificarlo. Yo quiero que lo hagas lucir hermosa, lo hagas lucir y actúes increíble. Así que hicimos todo el trabajo de back-end. Ahora solo puedes divertirte con todo el trabajo front-end. En el front-end el trabajo es realmente, muy divertido. Se llega a hacerlo realmente interactivo, colorido y hermoso. Puedes hacer que se vea y hacer cosas diferentes. Pero esencialmente deberías estar teniendo un proyecto como este en tu computadora que tome una imagen, suba, y muestre una miniatura, y luego tenemos una vista de detalle en Django. Siéntete libre de modificarlo al contenido de tu corazón. Y como no eres parte calificada, tienes una sección dedicada al proyecto. Es un pequeño botón verde que dice mi proyecto o algo así. Puedes hacer clic en ese botón y puedes agregar capturas de pantalla de tu código y cómo funciona. O puedes agregar un video si quisieras, podrías poner un video en YouTube y mostrarme que tu proyecto está funcionando y te puedo dar toneladas de retroalimentación si quieres.
22. Resumen: Está bien, lo hiciste. Llegaste a través de todo Django 101. Han pasado un par de horas. Hicimos una, una aplicación genial para compartir imágenes desde cero. Por cierto, si no lo sabías, esto es básicamente lo que era Instagram. Instagram se hizo con Django. El nuestro sólo se ve un poco diferente. El tuyo podría parecerse exactamente a Instagram si lo quisieras. Pero una vez más, sólo quería decir gracias por tomar este curso. Estoy muy orgullosa de ti por conseguir todo el camino a través de él. No lo olvides, siempre puedes seguirme en Twitter en Caleb Italian. O si quieres consejos y trucos de recubrimiento, puedes seguir el punto de codificación para dot todo el mundo en Instagram. Y si alguna vez te atascas o alguna vez necesitas ayuda para
cualquier cosa relacionada con el desarrollo web, ven únete, aprende a codificar en Facebook. Se trata de un grupo completamente gratuito. Todo lo que necesitas es una cuenta de Facebook. Gracias de nuevo por tomar este curso y pasar este tiempo conmigo y ojalá te vea en el futuro.