Tema 1: Estructura de proyecto en Django
hace 2 años · Actualizado hace 2 años
Este primer tema está orientado a que entiendas como funciona la estructura de un proyecto en Django: los ficheros que tenemos que utilizar y cómo, la relación interna entre ellos y como agilizar tareas utilizando esta información.
Además, quiero poner especial énfasis en la versatilidad que nos da Django si almacenamos toda la información que tengamos que mostrar en bases de datos.
Espero que este tema te ayude a entender mejor como funciona Django y si es así me gustaría que pusieras un comentario! Si por el contrario, notas que falta algo, también te animo a que me lo digas para que pueda mejorar el contenido de la web 😁
Estructura de ficheros en un proyecto en Django
Cuando estás por primera vez delante de tu ordenador con la intención de crear tu primera página web en Django y todavía no tienes ni idea de por donde empezar, lo primero que tienes que hacer es crear un proyecto de Django, utilizando el comando:
django-admin startproject nombredetuproyecto
Por supuesto, si todavía no has instalado la librería, primero debes hacerlo directamente con pip:
python -m pip install Django
Una vez creado el proyecto, verás que han aparecido una serie de ficheros por defecto: views.py, url.py, settings.py, entre otros. Déjame decirte que además de esos ficheros concretos, puedes utilizar otros cuantos que vienen especificados en alguna parte de la documentación de Django y que cada uno tiene su funcionalidad.
Aquí te dejo una imagen resumen por si quieres descargártela y tenerla a mano, pero te recomiendo que si estás iniciando leas el documento entero!
A continuación te voy a comentar brevemente cual es la funcionalidad de cada uno de los ficheros y cómo debemos utilizarlos correctamente. En los siguientes temas de este curso se profundizará mucho más en cada uno de estos ficheros y se harán ejemplos complejos de aplicaciones concretas para cada uno de ellos.
Settings.py
Este fichero es el más importante para configurar nuestro proyecto y si no le prestamos atención nos dará grandes dolores de cabeza.
Host
En el fichero de settings.py es donde debemos especificar diferentes aspectos como el dominio en el que se ejecutará el programa. Para ello se utiliza la variable ALLOWED_HOSTS, y durante la fase de desarrollo, que haremos las pruebas en nuestro PC, podemos dejarlo como una lista vacía o con la ip de localhost: '127.0.0.1'.
Apps
Además, cada vez que crees una nueva aplicación dentro de tu programa deberás incluirlo en la sección de aplicaciones instaladas, si no será como si no existieran. En concreto, se usa la variable INSTALLED_APPS, donde ya se incluyen aplicaciones por defecto instaladas, y a continuación es donde debes incluir tus implementaciones.
Templates y ficheros estáticos
En el fichero de configuración también debes incluir el directorio en el que se encuentran ficheros estáticos, bases de datos y los templates html que se van a utilizar en la aplicación web.
Para ello se usan diferentes variables: dentro de la variable TEMPLATES, en la sección 'DIRS', debemos incluir el directorio donde almacenemos los templates; en la variable DATABASES se especifica la ruta de la base de datos y el nombre que queramos ponerle (además del tipo de base de datos); por último, para los ficheros estáticos como imágenes, los estilos en css y otros ficheros estáticos, hay que configurar STATIC_URL con la url de la carpeta donde se encuentren los ficheros estáticos.
Models.py
En el fichero models.py es donde debemos especificar las bases de datos que utilizaremos en nuestro programa. Cuando estamos utilizando Django es relevante usar los modelos que nos proporciona la librería en lugar de almacenar la información en otro tipo de estructuras, como variables o ficheros.
El motivo es que la estructura y funcionamiento de Django facilita muchísimo la implementación si usamos modelos, pudiendo montar una aplicación web completa en una tarde si sabemos utilizarlo (en serio, no estoy exagerando!).
En este documento, debemos especificar los modelos que queremos utilizar. Por ejemplo, si queremos hacer un blog, podríamos hacer una clase tal que así:
class Blog (models.Model): nombre_autor = models.CharField(max_length=150) fecha = models.DateField() contenido_entrada = models.TextField()
Es un ejemplo muy sencillo, pero que sirve para que entiendas la idea.
Para ver más en profundidad como funcionan los modelos, deberías echarle un ojo a los temas relacionados:
Views.py
El fichero views.py es el encargado de hacer de intermediario entre las bases de datos o lógica interna (programación en python) y los html que se visualizarán en la web.
Para cada vista que queramos configurar se genera una clase o una función (puede implementarse de diferentes maneras según nuestras necesidades). En estas vistas especificaremos el html que tengamos en nuestros templates que se usará en esa vista o, por el contrario, mandaremos una respuesta en formato html generada en la función.
En la carpeta views.py podemos enviar información concreta, en formato diccionario, directamente a los templates. Esta información puede usarse utilizando diferentes operadores de python dentro de los html. De esta manera, podemos visualizar en los htmls información dinámica creada en la función que usemos internamente.
Por ejemplo, si quisiéramos visualizar las entradas de un blog con la estructura como la que te puse en la sección de modelos, en views.py tendremos algo tal que así:
class BlogView(TemplateView): template_name = "/blog.html" def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) blog = Blog.objects.all() context['blog'] = blog return context
Con la variable context, le enviamos información al template, como te comentaba antes. Así que para mostrar esta información, en blog.html tendremos un fragmento como este para mostrar la información del blog:
{% for entrada in blog %} <p> {{entrada.nombre_autor}} - {{entrada.fecha}} </p> <span> {{entrada.contenido_entrada}} </span> {% endfor %}
De esta manera iteramos entre los elementos de la base de datos que le pasamos al template mediante la variable contexto. Dentro de los templates podemos hacer muchas operaciones, pero entraremos en detalle de lo que podemos hacer y lo que no más adelante en este curso. Dentro de cada elemento de la base de datos, podemos acceder a sus atributos de forma similar a si fueran los atributos de una clase (ya que es la representación que tiene en nuestro código).
Los temas siguientes son en los que profundizo más en cuanto a views.py:
Forms.py
En el fichero forms.py es donde especificamos los formularios que queremos utilizar en nuestra página web. A efectos prácticos, un formulario es un elemento que permite al usuario interactuar con el sistema, habitualmente está relacionado a la interacción con la base de datos.
Por ejemplo, si queremos hacer un formulario en nuestro template blog.html, para que se puedan añadir nuevas entradas, tendremos que crear el formulario en forms.py que herede de la clase ModelForm. En la clase del formulario debemos especificar el modelo al que va asociado (en este caso, Blog) y los campos concretos que vamos a usar en el formulario.
Además, podemos especificar los widgets que se utilizarán para visualizar los datos del formulario:
class Entrada(forms.ModelForm): class Meta: model = Blog fields = ['nombre_autor', 'contenido_entrada'] widgets = { 'nombre_autor': forms.TextInput(), 'articulo': forms.Textarea(), }
Para que este formulario aparezca en nuestro html, tenemos que ajustar esta información en nuestro views.py. En este caso es mucho más sencillo que pasarle datos, simplemente debemos hacer los siguientes cambios y añadidos:
class BlogView(CreateViewTemplateView): template_name = "/blog.html" model = Blog form_class = Entrada def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) blog = Blog.objects.all() context['blog'] = blog return context
Con estos campos y añadidos que te he marcado sobre la clase que ya teníamos. En temas posteriores entraré más en detalle para explicarte el motivo de estos cambios, pero a grandes rasgos, tenemos que asignar las variables model y form_class al modelo y formulario que tenemos creados para vincularlos.
Por último, para utilizarlo en nuestro blog.html, sólo debemos crear un formulario y utilizar la variable form:
<form method="POST"> {% csrf_token %} <div>{{ form.nombre_autor }}</div> <div>{{ form.articulo }}</div> <div><button">Enviar</button></div> </form>
Y con estos pasos ya tenemos el modelo más simplificado de un blog.
Urls.py
En el fichero de urls.py hay que especificar la relación entre la url en la que queremos que se vea una vista y dicha vista. Es decir, es donde podremos asignar la vista de nuestro ejemplo BlogView a la subcarpeta blog/ dentro de nuestro dominio.
Un punto importante es que aunque este es el último fichero que he puesto en este tema, es de los primeros que tendrás que configurar si quieres hacer pruebas en tu navegador, ya que si no hay rutas asignadas en el fichero de urls, no se podrá acceder a ningún contenido de la página web.
Para que veas un pequeño ejemplo ilustrativo, vamos a continuar con nuestro blog. Para añadir la url 'blog/' a nuestro dominio asignándole la vista que hemos preparado, debemos escribir lo siguiente en nuestro fichero urls.py:
urlpatterns = [ path('blog/', BlogView.as_view(), name='blog'), ]
Con este código estamos añadiendo a la lista de urls de nuestra web la url 'blog/' que cuelga directamente del dominio principal. Esta url está asociada a la vista BlogView, que hemos especificado en nuestro documento views.py. A su vez, esta vista opera sobre el template blog.html, que es lo que se nos mostrará en el navegador cuando usemos la url del blog.
El parámetro name indica el nombre interno que recibe esa url para utilizarla en diferentes partes del código, pero entraremos en detalle más adelante.
Admin.py
Finalmente, el fichero admin.py es optativo pero muy útil, ya que nos permite añadir al panel de administración diferentes bases de datos que hayamos especificado en nuestro modelo. Django cuenta con un panel de administrador al que se puede acceder desde la url 'admin/' siempre y cuando esté presente en nuestro fichero de urls, claro.
El fichero de administrador es el más fácil de configurar para casos de uso básicos, ya que simplemente hay que escribir:
admin.site.register(Blog)
En este caso pondremos Blog ya que es el modelo con el que trabajamos en el ejemplo, pero se incluirán los modelos que queramos tener presentes en nuestro panel de administrador.
Estructuración del proyecto en Django
Además de la estructuración de los ficheros que te comentaba antes dentro de un proyecto en Django, hay otros detalles que debes tener en cuenta.
Lo más importante es que uses la mentalidad típica de la informática: divide y vencerás. Con esto me refiero a que en Django no tenemos un único proyecto. Bueno, si, pero el proyecto se divide en aplicaciones. Cada aplicación se usa para una funcionalidad concreta.
Por ejemplo, si creásemos una tienda online, una aplicación se utilizaría para los productos, otra para el blog, otra para manejar a los clientes y otra para las compras. Obviamente, en informática los problemas pueden solucionarse de diferentes maneras y el ejemplo que te acabo de poner también puede segmentarse de otras formas.
Hasta aquí llega el primer tema del curso de programación web en Django. Espero que te haya servido para entender mejor el funcionamiento de los proyectos en Django y te animo a que veas el resto de temas en la página del curso:
Deja una respuesta
Otras Entradas Relacionadas