Django
Django
py:
from django.contrib import admin
# Lee los metadatos de sus modelos para proporcionar una interfaz rápida
from .models import *
# 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)
#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"),
# 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/'
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
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: