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.
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:
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.