0% encontró este documento útil (0 votos)
34 vistas

Django

Este documento describe la configuración básica de una aplicación web de Django para administrar pedidos y clientes. Explica cómo registrar modelos de datos en la administración de Django, definir rutas URL, configurar plantillas, establecer permisos de usuario y conectar señales para crear perfiles de usuario.

Cargado por

Ruiz Juan Carlos
Derechos de autor
© © All Rights Reserved
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
34 vistas

Django

Este documento describe la configuración básica de una aplicación web de Django para administrar pedidos y clientes. Explica cómo registrar modelos de datos en la administración de Django, definir rutas URL, configurar plantillas, establecer permisos de usuario y conectar señales para crear perfiles de usuario.

Cargado por

Ruiz Juan Carlos
Derechos de autor
© © All Rights Reserved
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 17

Admin.

py:

from django.contrib import admin

# Lee los metadatos de sus modelos para proporcionar una interfaz rápida

centrada en el modelo donde los usuarios de confianza pueden administrar el

contenido de su sitio. El uso recomendado por el administrador se limita a la

herramienta de gestión interna de una organización.

from .models import *

# importaremos de model hasta todo los métodos, variables del archivo de


estructua de datos model.py

# Register your models here.
admin.site.register(Customer)
admin.site.register(Product)
admin.site.register(Tag)
admin.site.register(Order)
# para
la gestión de un modelo de datos en la administración de
Django, con el código registraremos el modelo de dados a admin.py
url.py:
rom django.contrib import admin
from django.urls import path, include

from django.conf.urls.static import static
from django.conf import settings
urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('accounts.urls')),
]

urlpatterns += static(settings.MEDIA_URL, document_root = settings.MEDIA_ROO
T)

# EN LA LISTA URLPATTERS INGRESAMOS LA FUNCION PATH donde esta la ruta de gestion de


datos que tiene django donde la ruta de línea admin.site.urls definiara que ruta le dica a django
que habilite la aplicación del sitio de administración

#y la otra función path agregaremos la dirección url desde el directorio de la aplicación del otro
url,py para si que el url,py principal de la url principal global no sea demasiado grande para leerlo.
url.py-accounts:
from django.urls import path
from . import views
#importamos views a directorio actual pore so ponemos el punto refiriendose
al directorio

urlpatterns = [
    
   
    #plantilla
    path('', views.home, name="home"),
    path('products/', views.products, name='products'),
    path('customer/<str:pk_test>/', views.customer, name="customer"),

    #crud
    path('create_order/<str:pk>/', views.createOrder, name="create_order"),
    path('update_order/<str:pk>/', views.updateOrder, name="update_order"),
    path('delete_order/<str:pk>/', views.deleteOrder, name="delete_order"),
    path('create_customer/', views.createCustomer, name="create_customer"),
    

    #login
    path('register/', views.registerPage, name="register"),
    path('login/', views.loginPage, name="login"),  
    path('logout/', views.logoutUser, name="logout"),

    #cliente
    path('account/', views.accountSettings, name="account"),
    path('user/', views.userPage, name="user-page"),

# luego en la lista o tuple urlpattera vamos a listar todos las url de


nuestra aplicacion importando desde views
# luego la variable name oara darle un nombre a una url dentro del arguemtno
de la ruta que significa que solo tenemso que el nombre de la url dentro del
atributo href en la plantilla
Setting.py
import os
# el import os, es la libreria que tiene por defecto Python la cual llama al
sistema operativo, que será herramienta para llamar la ruta actual donde se
ubica proyecto
from pathlib import Path

# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent
# donde se ubica el proyecto

# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/3.2/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'django-insecure-8otxbwgb2wmx$&t6!oc#*ggbdsj5caf%o
%9pouu66)4skx49-%'
# Se usa para produccion y es importante tenerla ya que django no funcionara
y no podra iniciar el proyecto

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

ALLOWED_HOSTS = []
#

# Application definition

INSTALLED_APPS = [
    'django.contrib.admin', ->agregar y manejar o todas las interaction del
proyecto
    'django.contrib.auth', -> referencia parte de los usuario para gestionar
el usuario
    'django.contrib.contenttypes',
    'django.contrib.sessions', -> session que trabaja de django
    'django.contrib.messages',
    'django.contrib.staticfiles', -> a los archivos css, js para poder
renderizarlos
    'accounts.apps.AccountsConfig',-> cada vez que creacion nuestra
aplicacion lo añadimos a la lista de aplicaciones instaladas
    'django_filters',
    'crispy_forms',
]
# modulos que contiene el framework django

CRISPY_TEMPLATE_PACK = 'bootstrap4'

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
# son la parte de la seguridad o gestion de seguridad por el framework

ROOT_URLCONF = 'crm1.urls'
#hace referencia al directorio url.py dentro de la carpeta principal, como
es un archivo principal por eso es que se enlaza

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [], -> en este campo se ingresara la ubicacion del template
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]
# hace refernecia a los template donde va estar ubicadas los templates en el
proyecto, internamente django tiene un sistema de plantilla, que podemos
rendirizar el lado frontend
#tambiene tiene algunos procesadores de contextos

WSGI_APPLICATION = 'crm1.wsgi.application'

# Database
# https://docs.djangoproject.com/en/3.2/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}

# Password validation
# https://docs.djangoproject.com/en/3.2/ref/settings/#auth-password-
validators

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimila
rityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValida
tor',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValid
ator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordVali
dator',
    },
]
# tenemos algunas validacion de contraseña para usuarios

# Internationalization
# https://docs.djangoproject.com/en/3.2/topics/i18n/

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'

USE_I18N = True

USE_L10N = True

USE_TZ = True

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/3.2/howto/static-files/

STATIC_URL = '/static/'
MEDIA_URL = '/images/'

# la ruta donde va estar nuestros archivos static e images

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static')
]

MEDIA_ROOT = os.path.join(BASE_DIR, 'static/images')
# solo haremos la ruta del sistema operativo Os y usara una variable base
dir y te mostrara donde viene y tenemos que informar a que carpeta busca
cual es nombre del archivo
# Default primary key field type
# https://docs.djangoproject.com/en/3.2/ref/settings/#default-auto-field

DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
Signal.py:

from django.db.models.signals import post_save
from django.contrib.auth.models import User
from django.contrib.auth.models import Group

from .models import Customer

def customer_profile(sender, instance, created, **kwargs):
    if created:
        group = Group.objects.get(name='customer')
        instance.groups.add(group)
        Customer.objects.create(
            user=instance,
            name=instance.username,
            )
        print('Profile created!')

post_save.connect(customer_profile, sender=User)
# modulo se señales, que cada vez que una instancia de usuario finalice la ejecucion de si metodo
de guarder, se ejecutar la funcion, mejor dicho ayuda a la aplicación recibir notificación cuando
ocurren acciones en otra parte del marco
Decorator.py :
Sirvira para permisos y autentificacion basados en roles de usuario

from django.http import HttpResponse
from django.shortcuts import redirect

def unauthenticated_user(view_func): -> arguemtno que es una vista de django


    def wrapper_func(request, *args, **kwargs):->
#  args y ** kwargs se utilizan para pasar un número variable de argumentos a una
función. El asterisco simple se usa para argumentos sin palabras clave y el doble
para argumentos con palabras clave.
        if request.user.is_authenticated:
# aqui haremos una condicional que por el atributo is_authenticated hara para saber si el
usuario ha sido autenticado

            return redirect('home')
        else:
            return view_func(request, *args, **kwargs)
#si no es asi me return al registro o login de la pagina

    return wrapper_func

def allowed_users(allowed_roles=[]):
    def decorator(view_func):
        def wrapper_func(request, *args, **kwargs):
# crearesmo tres capas de funciones

            group = None
            if request.user.groups.exists():
                group = request.user.groups.all()[0].name

            if group in allowed_roles:
                return view_func(request, *args, **kwargs)
            else:
                return HttpResponse('You are not authorized to view this pag
e')
        return wrapper_func
    return decorator

def admin_only(view_func):
    def wrapper_function(request, *args, **kwargs):
        group = None
        if request.user.groups.exists():
            group = request.user.groups.all()[0].name

        if group == 'customer':
            return redirect('user-page')

        if group == 'admin':
            return view_func(request, *args, **kwargs)

    return wrapper_function
@unauthenticated_user
def registerPage(request):

    form = CreateUserForm()
    if request.method == 'POST':
        form = CreateUserForm(request.POST)
        if form.is_valid():
            user = form.save()
            username = form.cleaned_data.get('username')

            messages.success(request, 'Account was created for ' + username)

            return redirect('login')
        

    context = {'form':form}
    return render(request, 'accounts/register.html', context)

@unauthenticated_user
def loginPage(request):

    if request.method == 'POST':
        username = request.POST.get('username')
        password =request.POST.get('password')

        user = authenticate(request, username=username, password=password)
        if user is not None:
            login(request, user)
            return redirect('home')
        else:
            messages.info(request, 'Username OR password is incorrect')

    context = {}
    return render(request, 'accounts/login.html', context)

def logoutUser(request):
    logout(request)
    return redirect('login')

@login_required(login_url='login')
@admin_only
def home(request):
    orders = Order.objects.all()
    customers = Customer.objects.all()

    total_customers = customers.count()

    total_orders = orders.count()
    delivered = orders.filter(status='Delivered').count()
    pending = orders.filter(status='Pending').count()

    context = {'orders':orders, 'customers':customers,
    'total_orders':total_orders,'delivered':delivered,
    'pending':pending }

    return render(request, 'accounts/dashboard.html', context)

@login_required(login_url='login')
@allowed_users(allowed_roles=['customer'])
def userPage(request):
    orders = request.user.customer.order_set.all()

    total_orders = orders.count()
    delivered = orders.filter(status='Delivered').count()
    pending = orders.filter(status='Pending').count()

    print('ORDERS:', orders)
    context = {'orders':orders, 'total_orders':total_orders,
    'delivered':delivered,'pending':pending}
    return render(request, 'accounts/user.html', context)

@login_required(login_url='login')
@allowed_users(allowed_roles=['customer'])
def accountSettings(request):
    customer = request.user.customer
    form = CustomerForm(instance=customer)

    if request.method == 'POST':
        form = CustomerForm(request.POST, request.FILES,instance=customer)
        if form.is_valid():
            form.save()

    context = {'form':form}
    return render(request, 'accounts/account_settings.html', context)

@login_required(login_url='login')
@allowed_users(allowed_roles=['admin'])
def products(request):
    products = Product.objects.all()

    return render(request, 'accounts/products.html', {'products':products})

@login_required(login_url='login')
@allowed_users(allowed_roles=['admin'])
def customer(request, pk_test):
    customer = Customer.objects.get(id=pk_test)

    orders = customer.order_set.all()
    order_count = orders.count()

    myFilter = OrderFilter(request.GET, queryset=orders)
    orders = myFilter.qs 
    context = {'customer':customer, 'orders':orders, 'order_count':order_cou
nt,
    'myFilter':myFilter}
    return render(request, 'accounts/customer.html',context)

@login_required(login_url='login')
@allowed_users(allowed_roles=['admin'])
def createOrder(request, pk):
    OrderFormSet = inlineformset_factory(Customer, Order, fields=('product', 
'status') )
    customer = Customer.objects.get(id=pk)
    formset = OrderFormSet(queryset=Order.objects.none(),instance=customer)
    
    if request.method == 'POST':
        
        form = OrderForm(request.POST)
        formset = OrderFormSet(request.POST, instance=customer)
        if formset.is_valid():
            formset.save()
            return redirect('/')

    context = {'form':formset}
    return render(request, 'accounts/order_form.html', context)

@login_required(login_url='login')
@allowed_users(allowed_roles=['admin'])
def updateOrder(request, pk):
    order = Order.objects.get(id=pk)
    form = OrderForm(instance=order)
    print('ORDER:', order)
    if request.method == 'POST':

        form = OrderForm(request.POST, instance=order)
        if form.is_valid():
            form.save()
            return redirect('/')

    context = {'form':form}
    return render(request, 'accounts/update_form.html', context)
@login_required(login_url='login')
@allowed_users(allowed_roles=['admin'])
def deleteOrder(request, pk):
    order = Order.objects.get(id=pk)
    if request.method == "POST":
        order.delete()
        return redirect('/')

    context = {'item':order}
    return render(request, 'accounts/delete.html', context)

def createCustomer(request):

    context = {
        'form': CustomerForm()
    }
    if request.method =="POST":
        form = CustomerForm(data=request.POST, files=request.FILES)
        if form.is_valid():
            form.save()
            context["mensaje"]="GUARDADO EXITOSO"
        else:
            context['form'] = form

    return render(request, 'accounts/create_customer.html', context)

#
el request:

El parámetro de solicitud es un HttpRequestobjeto que contiene datos sobre la solicitud


# request.method es objetos de solicitud y respuesta para pasar el estado a través del
sistema . Cuando se solicita una página, Django crea un objeto HttpRequest que contiene
metadatos sobre la solicitud. Luego, Django carga la vista apropiada, pasando
HttpRequest como primer argumento a la función de vista.

#La función login_required de Django se utiliza para


proteger las vistas en sus aplicaciones web
obligando al cliente a autenticarse con un usuario
que haya iniciado sesión válido.

También podría gustarte