Django,  HTML,  Python

Django – Error con CreateView, el formulario no hace nada, no guarda datos en base de datos

¡Albricias! Una nueva publicación…

Sí, vuelvo a escribir en éste, mi abandonado blog, para contaros cómo solucioné un error con django que me volvió loco durante un par de días…

Pero primero, ¿django? ¿qué es django?. Bueno, no voy a entrar en mucho detalle, pero os diré que es un framework de desarrollo web que me ha gustado bastante. Se consiguen webs completas con gran funcionalidad con muy poco esfuerzo. Está basado en python, cosa que ya de por sí es un plus, ya que recomiendo a todo el mundo aprender este lenguaje de programación que está arrasando en la lista de los lenguajes de programación favoritos 🙂

Entre las piezas de construcción de django, están las generic views, formas fáciles de crear páginas de listado, detalle, edición, creación y borrado (entre otras) de entidades en base de datos.

Pues bien, estaba probando una vista de creación (CreateView) y veía que por más que daba al botón «Crear» en mi formulario, el nuevo objeto que acababa de crear no se guardaba en base de datos. La página se recargaba, y en mi consola django salía la petición HTTP de creación, pero nada más. Ni mensajes de error, ni actualización de base de datos. Probé de todo, busqué en google y no encontré solución a mi problema (ni en inglés ni en español…)

Mi archivo views.py:

class RegionCreate(CreateView):
  template_name = 'obaju/region_form.html'
  model = Region
  fields = "__all__"

Mi archivo urls.py:

urlpatterns = [
...
  path('region/crear/', views.RegionCreate.as_view(), name="region_crear"),
...
]

Mi archivo models.py:

class Region(models.Model):
  nombre = models.CharField(max_length=50)
 
  def get_absolute_url(self):
    return reverse("region", kwargs={"pk": self.pk})
 
  def __str__(self):
    return "[" + str(self.id) + "] " + self.nombre

Mi archivo region_form.html:

<div class="col-md-9">
	<div class="box" id="crear">
		<h1>Crear región</h1>

		<form action "" method="" enctype="multipart/form-data">
{% csrf_token %}
			<div class="row">
{% include "obaju/form.html" %}

				<div class="col-sm-12 text-center">
					<button type="submit" class="btn btn-primary"><i class="fa fa-plus"></i> Crear</button>
				</div>
			</div>
			<!−− /.row −−>
		</form>
	</div>

Mi archivo form.html:

<div class="form-group">
  <div class="col-sm-offset-2 col-sm-10">
	<span class="text-danger small">{{ field.error }}</span>
  </div>
  <label class="control-label col-sm-2">{{ field.label_tag }}</label>
  <div class="col-sm-10">{{ field }}</div>
</div>

Todo parecía correcto, o eso me parecía a mí. ¿Qué podía pasar? ¿Un fallo al declarar la vista? ¿Un error conocido de la versión de django que estoy usando? ¿Un simple error en el html del formulario? Sí, justamente esto último… Me faltaba el método «post» en en formulario:

<form action "" method="post" enctype="multipart/form-data">
{% csrf_token %}
	<div class="row">
{% include "obaju/form.html" %}

		<div class="col-sm-12 text-center">
			<button type="submit" class="btn btn-primary"><i class="fa fa-plus"></i> Crear</button>
		</div>
	</div>
	<!−− /.row −−>
</form>

Con la de vueltas que le dí a toooodo el código python, pensando una y otra vez que el error tenía que estar ahí, ya que es el lenguaje que menos conocía, resulta que el error era en el antiguo y conocido HTML…

A veces los errores están delante tuya, y no los ves… A veces confías en que lo que haces desde hace tiempo ya lo tienes dominado, pero te pasan este tipo de cosas 🙂

Espero que este artículo le sirva a alguien que haya tenido el mismo problema que yo 😉

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Ver
Privacidad