Introducción a Django

Miguel Cantillana F

<miguel@ewok.cl>

Qué es Django?

Django es un framework de desarrollo web de código abierto, escrito en el Python. Utiliza el patro de diseño modelo vista controlador (MTV).
Django, el web framework para perfeccionistas

Características

  • Django promueve el desarrollo rápido, se construyen aplicaciones en cuestión de días y con el conocimiento suficiente esos días se pueden reducir a horas.
  • Django impulsa el desarrollo de código limpio al promover buenas prácticas de desarrollo web, sigue el principio DRY (conocido también como Una vez y sólo una).
  • Django usa una modificación de la arquitectura Modelo-Vista-Controlador (MVC), llamada MTV (Model – Template – View), que sería Modelo-Plantilla-Vista, está forma de trabajar permite que sea pragmático.

Framework 3.0

Arquitectura

Entendiendo como trabaja Django

Arquitectura MVC MTV

Componentes básicos

Componentes

  • URL dispatcher
  • Vistas
  • Plantillas
  • Modelos (ORM)
  • Admin

Instalación y primera aplicación

docker-compose run web django-admin startproject main .
├── docker-compose.yml
├── Dockerfile
├── main
│   ├── asgi.py
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── manage.py
└── requirements.txt

Estructura del proyecto

docker

  • Permite encapsular nuestro proyecto
  • Manejar dependencias
  • Evitar problemas de versiones de bibliotecas

docker-compose.yml

version: '3'

services:
    web:
        image: mcantillana/django_unab:3
        ports:
            - "8000:8000"
        command: python manage.py runserver 0:8000
        volumes:
            - .:/code

docker-compose run web django-admin startproject main .
├── db.sqlite3
├── docker-compose.yml
├── main
│   ├── __init__.py
│   ├── __pycache__
│   │   ├── __init__.cpython-36.pyc
│   │   ├── settings.cpython-36.pyc
│   │   ├── urls.cpython-36.pyc
│   │   └── wsgi.cpython-36.pyc
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── manage.py
docker-compose run web python manage.py migrate 

docker-compose up

docker-compose up -d

setting.py

Base de datos

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
        'NAME': '',                      # Or path to database file if using sqlite3.
        'USER': '',                      # Not used with sqlite3.
        'PASSWORD': '',                  # Not used with sqlite3.
        'HOST': '',                      # Set to empty string for localhost. Not used with sqlite3.
        'PORT': '',                      # Set to empty string for default. Not used with sqlite3.
    }
}

Otras Configuraciones

# Codificación de caracteres
#encoding:utf-8

# Zona horaria
TIME_ZONE = 'America/Santiago'

# Configuración del idioma

LANGUAGE_CODE = 'es-CL'

Django Admin

docker-compose run web python manage.py createsuperuser

Django App

Proyecto

App1

App2

App3

App4

Creando aplicaciones

docker-compose run web python manage.py startapp blog


├── mysite
|       __init__.py
|       settings.py
|       urls.py
|       wsgi.py
├── manage.py
└── blog
    ├── migrations
    |       __init__.py
    ├── __init__.py
    ├── admin.py
    ├── models.py
    ├── tests.py
    └── views.py


# se debe registrar el app en setting.py

Modelos


class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')


class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)

Definición de un modelo

Registrando Modelos en Admin

APP/admin.py

from django.contrib import admin
from .models import Post

admin.site.register(Post)

APP/admin.py

class OrderItemInline(admin.StackedInline):
    model = Order_Item
    extra = 0

class OrderProfileAdmin(admin.ModelAdmin):
    list_display = ('name', 'paternal_name', 'maternal_name', 'gender', 'email', 'circuit', 'category', 'identification_type', 'identification_country', 'identification_number', 'created', 'updated')
    list_filter = ('circuit','category',)

class OrderAdmin(admin.ModelAdmin):
	list_display = ('firstname', 'lastname', 'total', 'status', 'created', 'updated','id','uuid')
	list_filter = ('status',)

	search_fields = ['id','uuid',]
	inlines = [OrderItemInline]


class OrderStatusAdmin(admin.ModelAdmin):
	list_display = ('name', 'order', 'id')


class OrderDiscountAdmin(admin.ModelAdmin):
	list_display = ('name', 'percent', 'code', 'quotas', 'start', 'end', 'created', 'updated', 'race','id')


class OrderDiscountHistoryAdmin(admin.ModelAdmin):
	list_display = ('discount', 'ticket', 'order_item', 'date', 'created', 'updated','id')


admin.site.register(Order,OrderAdmin)
admin.site.register(Order_Status,OrderStatusAdmin)
admin.site.register(Order_Profile,OrderProfileAdmin)
admin.site.register(Order_Discount,OrderDiscountAdmin)
admin.site.register(Order_Discount_History,OrderDiscountHistoryAdmin)

Django SHELL

python manage.py shell

Actividad

Ejercicio Django

  • Desarrolle un modelo en Django que permita relacionar noticias con categorías.
  • Cada noticia puede pertenecer a una categoría y cada categoría puede pertenecer a más de una noticia.
  • Cada noticia debe contener un titulo, cuerpo de contenido, estado de publicación y fecha de publicación.
  • Cada categoría debe contener como mínimo un nombre, estado y orden.
  • Debe completar el sistema con 1000 registros de ejemplo

 

UNAB: DW08 / Introducción a Django

By Miguel Cantillana

UNAB: DW08 / Introducción a Django

Clase 8

  • 1,320