es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Django CreateView no guarda el objeto y no muestra un error.

Estoy trabajando en un nuevo proyecto y estoy teniendo dificultades para agregar nuevos objetos desde la página de usuarios. Se puede agregar desde el panel de administración.
Este es el modelo:

class Product(models.Model):
    title = models.CharField(max_length=150)
    price = models.IntegerField()
    image = models.ImageField(upload_to='products')
    description = models.TextField(max_length=500)
    owner = models.ForeignKey(User, on_delete=models.CASCADE)

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('product-details', kwargs={'pk': self.pk})

Tengo esta vista:

class ProductCreateView(LoginRequiredMixin, CreateView):
    model = Product
    fields = ['title', 'image', 'description', 'price']

    def form_valid(self, form):
        form.instance.owner = self.request.user
        # form.save() # También intenté esto y no funcionó
        return super().form_valid(form)

product_form.html:

{% extends "index/base.html" %}
{% load crispy_forms_tags %}
{% block content %}
    <div class="content-section">
        <form method="POST">
            {% csrf_token %}
            <fieldset class="form-group">
                <legend class="border-bottom mb-4">Product</legend>
                {{ form|crispy }}
            </fieldset>
            <div class="form-group">
                <button class="btn btn-outline-info" type="submit">Guardar</button>
            </div>
        </form>
    </div>
{% endblock content %}

Intenté varias veces y no funcionó. Entonces busqué soluciones e intenté lo siguiente:

instance = form.save(commit=False)
instance.owner = self.request.user
instance.save()
return super().form_valid(instance)

y esto

self.object.owner = self.request.user
self.object = form.save()
return super(ProductCreateView, self).form_valid(form)

dentro de form_valid(). Ninguno de ellos funcionó. Entonces puedo abrir el formulario y completar los campos. Cuando lo envío, el objeto no se guarda pero no muestra ningún error. Simplemente vuelve a cargar el formulario.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema puede estar en la plantilla product_form.html. En la etiqueta form, falta el atributo “action” que especifica a dónde se debe enviar los datos del formulario.

    Intenta actualizar tu plantilla product_form.html para incluir el atributo action:

    {% extends "index/base.html" %}
    {% load crispy_forms_tags %}
    {% block content %}
        <div class="content-section">
            <form method="POST" action="{% url 'product-create' %}">
                {% csrf_token %}
                <fieldset class="form-group">
                    <legend class="border-bottom mb-4">Producto</legend>
                    {{ form|crispy }}
                </fieldset>
                <div class="form-group">
                    <button class="btn btn-outline-info" type="submit">Guardar</button>
                </div>
            </form>
        </div>
    {% endblock content%}
    

    Asegúrate de reemplazar 'product-create' con el nombre real de la URL para CreateView en tu archivo urls.py.

    Si el problema persiste, verifica tu consola para ver si hay mensajes de error que puedan darte una pista sobre qué está saliendo mal.

Comments are closed.