Upgrade to PRO for Only $50/Year—Limited-Time Offer! šŸ”„

M6 hito III

Avatar for marco contreraas marco contreraas
July 19, 2024
20

M6 hitoĀ III

Avatar for marco contreraas

marco contreraas

July 19, 2024
Tweet

Transcript

  1. REQUERIMIENTO 1 Crear modelo Flan, generar y aplicar sus migraciones

    y agregar el modelo al panel de administración. Agrega al menos 8 elementos de Flan.
  2. HITO 3 - REQUERIMIENTO 1 Aquí tenemos la definición del

    modelo Flan, segĆŗn el requerimiento AquĆ­ tenemos que editar para definir el modelo Flan
  3. HITO 3 - REQUERIMIENTO 1 Aquí generamos la migración inicial

    Aquí estÔ contenido del archivo de migración generado
  4. HITO 3 - REQUERIMIENTO 1 AquĆ­ mostramos las tablas que

    se crearon en la base de datos posterior a ejecutar las migraciones Describimos la tabla en la base de datos Nos conectamos a la base de datos
  5. HITO 3 - REQUERIMIENTO 1 AquĆ­ tenemos que editar para

    registrar el modelo Registramos el modelo en el panel administrativo
  6. HITO 3 - REQUERIMIENTO 1 Creamos el superusuario Revisamos la

    creación en la base de datos Revisamos la creación a través del shell de Django
  7. HITO 3 - REQUERIMIENTO 1 127.0.0.1:8080/admin Iniciamos sesión en el

    panel de admin Administramos el modelo registrado
  8. HITO 3 - REQUERIMIENTO 1 Guardamos el nuevo flan en

    la base de datos Completamos los campos
  9. HITO 3 - REQUERIMIENTO 1 Podemos editar o eliminar el

    registro creado Revisamos la creación en la base de datos
  10. REQUERIMIENTO 2 Mostrar tus flanes recién creados al público. Agrégale

    el resultado de todos los Flanes existentes en tu sitio web como contexto a tu vista de la ruta ā€œindiceā€ e imprime los resultados a travĆ©s de la plantilla index.html por medio de componentes cards de bootstrap, utilizando un ciclo for de las plantillas de django para mostrar cada uno de los Flan anteriormente creados. - En la pĆ”gina ā€œindiceā€ se mostrarĆ”n solo los Flan cuyo atributo is_private es False. - En la pĆ”gina ā€œwelcomeā€, se mostrarĆ”n solo los Flan cuyo atributo is_private es True.
  11. HITO 3 - REQUERIMIENTO 2 web/views.py from django.shortcuts import render

    def indice(request): flans = Flan.objects.all() return render(request, 'index.html', { 'flans': flans }) Enviamos el contexto (variable) al template para accederlo.
  12. HITO 3 - REQUERIMIENTO 2 web/templates/index.html {% extends "base.html" %}

    {% block content %} <h2>ƍndice</h2> <div class="container my-4"> <div class="row"> {% for flan in flans %} <div class="col-6 col-md-3"> <div class="card shadow-sm mb-3 border"> <img src="{{ flan.image_url }}" alt="{{ flan.name }}" class="card-img-top"> <div class="card-body"> <h5 class="card-title">{{ flan.name }}</h5> <p class="card-text">{{ flan.description }}</p> </div> </div> </div> {% endfor %} </div> </div> {% endblock %} Recorremos el conjunto de flanes Utilizamos el componente card de bootstrap
  13. HITO 3 - REQUERIMIENTO 2 web/views.py def indice(request): flanes_publicos =

    Flan.objects.filter(is_private=False) return render(request, 'index.html', { 'flanes_publicos': flanes_publicos }) def acerca(request): return render(request, 'about.html', {}) def bienvenido(request): flanes_privados = Flan.objects.filter(is_private=True) return render(request, 'welcome.html', { 'flanes_privados': flanes_privados }) Enviamos al contexto sólo aquellos flanes que su atributo is_private sea False. Enviamos al contexto sólo aquellos flanes que su atributo is_private sea True.
  14. HITO 3 - REQUERIMIENTO 2 web/templates/index.html {% for flan in

    flanes_publicos %} <div class="col-6 col-md-3"> <div class="card shadow-sm mb-3 border"> <img src="{{ flan.image_url }}" alt="{{ flan.name }}" class="card-img-top"> <div class="card-body"> <h5 class="card-title">{{ flan.name }}</h5> <p class="card-text">{{ flan.description }}</p> </div> </div> </div> {% endfor %} Recorremos los flanes pĆŗblicos en el template index.html web/templates/welcome.html {% for flan in flanes_privados %} <div class="col-6 col-md-3"> <div class="card shadow-sm mb-3 border"> <img src="{{ flan.image_url }}" alt="{{ flan.name }}" class="card-img-top"> <div class="card-body"> <h5 class="card-title">{{ flan.name }}</h5> <p class="card-text">{{ flan.description }}</p> </div> </div> </div> {% endfor %} Recorremos los flanes privados en el template welcome.html
  15. REQUERIMIENTO 3 Crear el modelo ContactForm, generar y aplicar sus

    migraciones y agregar el modelo al panel de administración de Django. Atributo Tipo Anotaciones contact_form_uuid UUIDField default = uuid.uuidd4, editable = False customer_email EmailField customer_name CharField max_length = 64 message TextField
  16. HITO 3 - REQUERIMIENTO 3 Aquí tenemos la definición del

    modelo ContacForm, segĆŗn el requerimiento AquĆ­ tenemos que editar para definir el nuevo modelo
  17. HITO 3 - REQUERIMIENTO 3 AquĆ­ revisamos la base de

    datos Aquí generamos la nueva migración
  18. HITO 3 - REQUERIMIENTO 3 AquĆ­ tenemos que editar para

    registrar el modelo Registramos el modelo en el panel administrativo
  19. HITO 3 - REQUERIMIENTO 3 templates/contact.html {% extends "base.html" %}

    {% block content %} <h2>Contacto</h2> {% endblock %} Creamos el template que mostrarƔ el contenido onlyflans/urls.py from django.contrib import admin from django.urls import path from web.views import indice, acerca, bienvenido urlpatterns = [ path('admin/', admin.site.urls), path('', indice, name='indice'), path('acerca', acerca, name='acerca'), path('bienvenido', bienvenido, name='bienvenido'), path('contacto', contacto, name='contacto'), ] AƱadimos la vista al urlpattern
  20. HITO 3 - REQUERIMIENTO 3 templates/navbar.html <nav class="navbar navbar-expand-lg bg-body">

    <div class="container-fluid"> <button class="navbar-toggler" type="button" data-bs-target="#navbar" data-bs-toggle="collapse"> <span class="navbar-toggler-icon"></span> </button> <div class="collapse navbar-collapse" id="navbar"> <div class="navbar-nav me-auto mb-2 mb-lg-0"> <a class="nav-link" aria-current="page" href="{% url "indice" %}">ƍndice</a> <a class="nav-link" href="{% url "acerca" %}">Acerca</a> <a class="nav-link" href="{% url "bienvenido" %}">Bienvenido</a> <a class="nav-link" href="{% url "contacto" %}">Contacto</a> </div> </div> </div> </nav> Agregamos la url a la navegación
  21. HITO 3 - REQUERIMIENTO 1 web/forms.py from django import forms

    class ContactFormForm(forms.Form): customer_email = forms.EmailField(label="Correo") customer_name = forms.CharField(max_length=64, label="Nombre") message = forms.CharField(label="Mensaje") Creamos el formulario, que luego pasaremos al contexto web/views.py from .forms import ContactFormForm def contacto(request): if request.method == "POST": form = ContactFormForm(request.POST) if form.is_valid(): return HttpResponseRedirect('/') else: form = ContactFormForm() return render(request, 'contact.html', { 'form': form }) Importamos el formulario, y lo pasamos al contexto y le pasamos la información si la petición viene por el método POST.
  22. HITO 3 - REQUERIMIENTO 3 web/templates/contact.html {% extends "base.html" %}

    {% block content %} <div class="container"> <form action="/contacto" method="post"> {% csrf_token %} {{ form }} <input type="submit" value="Submit"> </form> </div> {% endblock %} Formulario renderizado en el navegador Formulario renderizado en la plantilla
  23. HITO 3 - REQUERIMIENTO 3 web/views.py def exito(request): return render(request,

    'success.html', {}) Definimos una vista para renderizar una plantilla de exito web/templates/success.html {% extends "base.html" %} {% block content %} <h3>Exito</h3> {% endblock %} AƱadimos contenido a la plantilla onlyflans/urls.py urlpatterns = [ path('admin/', admin.site.urls), path('', indice, name='indice'), path('acerca', acerca, name='acerca'), path('bienvenido', bienvenido, name='bienvenido'), path('contacto', contacto, name='contacto'), path('exito', exito, name='exito'), ] AƱadimos la url al urlpatterns
  24. HITO 3 - REQUERIMIENTO 3 web/templates/success.html {% extends "base.html" %}

    {% block content %} <div class="container my-5"> <div class="col-12 col-md-6 mx-auto text-center"> <h3>Gracias por contactarte con OnlyFlans<br/> te responderemos en breve</h3> <div class="text-center"> <a href="{% url 'indice' %}" class="btn btn-primary"> Volver al inicio </a> </div> </div> </div> {% endblock %}
  25. HITO 3 - REQUERIMIENTO 3 web/views.py from .models import Flan,

    ContactForm def contacto(request): if request.method == "POST": form = ContactFormForm(request.POST) if form.is_valid(): ContactForm.objects.create(**form.cleaned_data) return HttpResponseRedirect('/exito') else: form = ContactFormForm() return render(request, 'contact.html', { 'form': form }) Creamos un nuevo registro en la bd Revisamos en la bd el registro creado
  26. HITO 3 - REQUERIMIENTO 3 web/templates/contact.html {% block content %}

    <div class="col-12 col-md-6 mx-auto"> <form action="/contacto" method="post" class="card p-3"> {% csrf_token %} {{ form.nom_field_errors }} <div class="mb-3"> {{ form.customer_email.label_tag }} {{ form.customer_email }} </div> <div class="mb-3"> {{ form.customer_name.label_tag }} {{ form.customer_name }} </div> <div class="mb-3"> {{ form.message.label_tag }} {{ form.message }} </div> <input type="submit" value="Enviar" class="btn btn-success"> </form> </div> {% endblock %} web/forms.py class ContactFormForm(forms.Form): customer_email = forms.EmailField(label="Correo",widget=forms.EmailInput( attrs={ 'class': 'form-control', 'placeholder': '[email protected]' } )) customer_name = forms.CharField( max_length=64, label="Nombre", widget=forms.TextInput( attrs={ 'class': 'form-control', 'placeholder': 'jhon doe' } )) message = forms.CharField(label="Mensaje", widget=forms.Textarea( attrs={ 'class': 'form-control', 'placeholder': 'Escribenos tu experiencia o recomendación' } ))
  27. HITO 3 - REQUERIMIENTO 3 web/forms.html class ContactFormModelForm(forms.ModelForm): class Meta:

    model = ContactForm fields = ['customer_email', 'customer_name', 'message'] web/views.py from .forms import ContactFormForm,ContactFormModelForm def contacto(request): if request.method == "POST": form = ContactFormModelForm(request.POST) if form.is_valid(): ContactForm.objects.create(**form.cleaned_data) return HttpResponseRedirect('/exito') else: form = ContactFormModelForm() return render(request, 'contact.html', { 'form': form }) Creación de formulario con ModelForm web/templates/contact.html <form action="/contacto" method="post" class="card p-3"> {% csrf_token %} {{ form.nom_field_errors }} {{ form }} <input type="submit" value="Enviar" class="btn btn-success"> </form>