CreateView no guarda en la base de datos con save()

publicado por: Anonymous

Ayer pregunte algo sobre el formulario donde me ayudaron rápidamente. Hoy vengo, con el mismo asunto, por ese formulario que lo que yo coloco en ese formulario no se guarda en la base de datos y me redirecciona a la url pero no me las muestras.

Pensaba que con save() y dentro de formvalid() podía resultar pero así tampoco me funciona.

models.py

from django.db import models
from django.forms import ModelForm

class Item(models.Model):
    title = models.CharField(max_length=255)
    created = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.title

class ItemForm(ModelForm):
    class Meta:
        model = Item
        fields = ['title']

urls.py

from django.conf.urls import url
from .views import ItemListView, ItemAddView

app_name = 'items'
urlpatterns = [
    url(r'^$', ItemListView.as_view(), name="item"),
    url(r'^agregar/$', ItemAddView.as_view(), name="item_add"),
]

views.py

from django.shortcuts import render

from django.views.generic import ListView, CreateView

from .models import Item, ItemForm

class ItemListView(ListView):
    template_name = 'items/items_list.html'
    model = Item

class ItemAddView(CreateView):
    model = Item
    template_name = 'items/item_form.html'
    form_class = ItemForm
    success_url = 'item'

    def form_valid(self, form):
        form.save()
        return super(ItemAddView, self).form_valid(form)

template

{% extends "base.html" %}

{% block content %}
    <form action="/" method="POST">
        {% csrf_token %}
        {{ form.as_p }}
        <button type="submit">Agregar</button>
    </form>
{% endblock content %

}

Espero que alguien pueda resolver esta duda, saludos!

solución

Un formulario en HTML, es una metáfora de los formularios o formatos en papel: recopilan información en campos de diferentes tipos para que esta información pueda ser procesada posteriormente.

Entonces, al crear un formulario en HTML necesitas indicar que datos quieres recopilar y en dónde se va a procesar la información que recolectes.

Insisto en los formularios en HTML, porque el problema está relacionado con Django solo tangencialmente, el problema aquí es que no están claros los conceptos que tienen que ver con los formularios.

Un formulario, entonces, recolecta información en campos de diferentes tipos, en tu caso particular:

  • un campo de entrada id_title de tipo text, <input type="text" ...>
  • un campo de entrada id_created de tipo text, <input type='text' ...>

Existe también un campo especial, tipo submit que envía los datos del formulario al lugar indicado para su procesamiento (obvio no es un lugar) indicado en el parámetro action de la marca <form>.

Y aquí es donde está tu error.

Si revisamos la línea <form> en tu formulario

<form action="/" method="POST">

vemos que estás enviando el formulario a la raíz. Ahora, en tu archivo urls.py vemos que la ruta / la maneja la vista ItemListView cuya función no es actualizar el modelo, sino listar los registros que se modelo contiene.

Para que tu formulario funcione, debes enviar los datos a la vista que has creado para actualizar el modelo, es decir, a ItemAddView.

En conclusión, tu plantilla debería verse así:

{% extends "base.html" %}

{% block content %}
  <form action="{% url 'item_add' %}" method="POST">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">Agregar</button>
  </form>
{% endblock content %}

Referencias

Respondido por: Anonymous

Leave a Reply

Your email address will not be published.