12 4_Formularios
jp.av.dev edited this page 2021-07-02 22:14:30 -04:00

Ir a: Repositorio, Admin Panel, Envio de Mails


Formularios

Forms doc

Creacion del formulario

/TiendaOnline/gestionPedidos/templates/busqueda_prods.html

<html>
    <head>
        <title>Búsqueda de productos</title>
    </head>
    <body>
        <form action="/buscar/" method="GET">
            <input type="text" name="prod">
            <input type="submit" value="Buscar">
        </form>
    </body>
</html>

Creación vista formulario

gestionPedidos/views.py

from django.shortcuts import render

# Create your views here.
def busqueda_productos(request):
    return render(request, "busqueda_prods.html")

Restistrar url (path)

urls.py

...
from gestionPedidos import views

urlpatterns = [
    ....
    path('buscar_productos/', views.busqueda_productos),
    ....

Crear vista para el submit 'buscar'

gestionPedidos/views.py

...
from django.http import HttpResponse

...
def buscar(request):
    msj = "Estas búscando por: %r" %request.GET["prod"]
    return HttpResponse(msj)

Registrar url

urls.py

...

urlpatterns = [
    ...
        path('buscar/', views.buscar),
]

Metodo GET http://192.168.0.4:8000/buscar/?prod=alicate

Busqueda en BBDD

views.py

...
from gestionPedidos.models import Articulos

...
def buscar(request):
    # Validación campo vacio
    if request.GET["prod"]:
        #msj = "Estas búscando por: %r" %request.GET["prod"]
        prod_buscar = request.GET["prod"]
        articulos = Articulos.objects.filter(nombre__icontains=prod_buscar)
        return render(request, "resultado_busqueda.html", {"articulos":articulos, "query":prod_buscar})

    else:
        msj = "Debes introducir un termino de búsqueda"
    return HttpResponse(msj)

__icontains similar a like SQL, busca en el campo indicado,
articulos que CONTENGAN la palabra a buscar.

resultado_busqueda.html

<body>
    <p>Estás buscando <strong>{{query}}</strong></p>
    {% if articulos %}
        <p>Encontrados : {{articulos|length}} artículos</p>
        <ul>
            {% for articulo in articulos %}
                <li>{{articulo.nombre}} &nbsp; {{articulo.seccion}} &nbsp;${{articulo.precio}}</li>
            {% endfor %}
        </ul>
    {% else %}
        <p>Artículo no encontrado</p>
    {% endif %}
</body>

Limitar cantidad de caracteres en busqueda

views.py

...

def buscar(request):
    # Validación campo vacio
    if request.GET["prod"]:
        prod_buscar = request.GET["prod"]
        if len(prod_buscar) > 20:
            msj = "Termino de búsqueda demasiado largo"
        else:
            articulos = Articulos.objects.filter(nombre__icontains=prod_buscar)
            return render(request, "resultado_busqueda.html", {"articulos":articulos, "query":prod_buscar})
    ...

Formulario de contacto

contacto.html

    <body>
        <h1>Formulario de contacto</h1>
        <form action="/contacto/" method="POST">
        {% csrf_token %}
        
            <p>Asunto: <input type="text" name="asunto"></p>
            <p>Mail  : <input type="text" name="mail"></p>
            <p>Mensaje: </p>
            <p><textarea name="mensaje" rows="15" cols="45"></textarea></p>
            
            <input type="submit" value="Enviar">
        </form>
    </body>

{% csrf_token %} Protección contra CSRF
This should not be done for POST forms that target external URLs, since that would cause the CSRF token to be leaked, leading to a vulnerability.

gracias.html

...
<h1>Gracias por contactarnos</h1>
...

views.py

...
def contacto(request):
    if request.method == "POST":
        return render(request, "gracias.html")
    return render(request, "contacto.html")

urlpatterns urls.py

...
    path('contacto/', views.contacto),`  
...

Ir a: Repositorio, Admin Panel, Envio de Mails