¿Como django recibe los datos enviados por el método POST?

publicado por: Anonymous

Tengo una vista basada en clase, un CreateView y es la siguiente:

@method_decorator(staff_member_required, name = 'dispatch')
class PageCreate(CreateView):
    model = Page
    form_class = PageForm
    success_url = reverse_lazy('pages:pages')

Y este seria el template donde muestro el formulario de PageCreate:

{% extends 'core/base.html' %}
{% load static %}
{% block title %}Crear página{% endblock %}
{% block content %}
{% include 'pages/includes/pages_menu.html'%}
  <main role="main">
    <div class="container">
      <div class="row mt-3 mb-5">
  <div class="col-md-9 mx-auto">
    <form action="" method="post">{% csrf_token %}
      {{ form.as_p }}
      <div class="text-center">
      <input type="submit" class="btn btn-primary btn-block" value="Crear página" />
      </div>
    </form>
  </div>
      </div>
    </div>
  </main>
{% endblock %}

Bueno mi duda es ¿Como es que django recibe los datos enviados por el método POST? Lo recibe en la vista(PageCreate)?.

Tengo la duda también de que en ningún momento se indica en el atributo action de la etiqueta form a donde se enviaran los datos, ¿Entonces a donde se envían los datos exactamente? y nuevamente ¿Acaso recibe los datos la vista(PageCreate)?

Se los agradecería mucho que me explicaran sobre este tema para así poder resolver mi dudas…

De antemano muchas gracias por sus respuestas!

solución

Cuando no defines action por defecto HTML hace que se envíen a la misma url donde está el formulario. Por lo que si en tu archivo de urls definiste que el formulario se va a renderizar cuando consulten la url /hola entonces, el formulario enviará la petición a esa dirección pero con un POST. Esto puedes verificarlo desde el inspector del navegador que uses en la pestaña de Network.

Según dice esta página (te recomiendo que la guardes, ya que si trabajas con Class Based Views te será muy útil). Te responderé las preguntas:

¿Cómo es que Django recibe los datos enviados por el método POST?

Responder tu pregunta tal cual, es algo complicado, si quisieras saber la forma exacta en cuando Django recibe los parámetros por POST, deberás ver el código del objeto RequestDict (No recuerdo el nombre exacto) y a partir de ahí, ver como lee la petición en raw y como hace el parse. De todas formas ese proceso es algo repetitivo y no es muy interesante de saber, solo debemos confiar que Django tiene los datos si se los hemos envíado. Ahora, la forma de recuperarlos siempre será la misma en Django, para ello puedes entrar a tu método post dentro de la clase, te recomiendo hacerlo así:

def post(self, request, *args, **kwargs):
  print(request.POST)  # de esta forma estás viendo los datos que se envían en el formulario de HTML
  return super(self.__class__, request, *args, **kwargs)

¿Lo recibe en la vista PageCreate?

Para responder esta pregunta, necesitaría ver tu archivo de urls.py y efectivamente saber que todo está “ruteado” para que así lo pueda recibir, pero depende de eso. Django no hará nada que no le pidas que haga, así que lo más probable es que si definiste la url del formulario a GET /formulario entonces el envíe el formulario a POST /formulario y será la misma clase PageCreate, solo que atendiendo diferentes métodos. Si quieres comprobar, te bastaría con verificar los logs y añadir este código:

def get(self, request, *args, **kwargs):
  print("Esto es un GET")
  return super(self.__class__, request, *args, **kwargs)

def post(self, request, *args, **kwargs):
  print("Esto es un POST")
  return super(self.__class__, request, *args, **kwargs)

Espero que esto pueda ayudarte a resolver tus preguntas, pero cualquier pregunta que tengas no dudes en comentar y con gusto te ayudaré a responderlas

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *