Django CreateView не сохраняет объект и не выдает ошибку
Я работаю над новым проектом и у меня возникли трудности с добавлением новых объектов со страницы пользователей. Они могут быть добавлены из панели администратора. Вот модель:
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})
У меня такой вид:
class ProductCreateView(LoginRequiredMixin, CreateView):
model = Product
fields = ['title', 'image', 'description', 'price']
def form_valid(self, form):
form.instance.owner = self.request.user
#form.save()
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">Save</button>
</div>
</form>
</div>
{% endblock content%}
Я пробовал несколько раз, и у меня ничего не получилось. Поэтому я искал решения и попробовал следующее:
instance = form.save(commit=False)
instance.owner = self.request.user
instance.save()
return super().form_valid(instance)
и это
self.object.owner = self.request.user
self.object = form.save()
return super(ProductCreateView, self).form_valid(form)
внутри form_valid(). Ни одна из них не сработала. Итак, я могу открыть форму и заполнить поля. Когда я отправляю ее, объект не сохраняется, но это не дает никакой ошибки. Просто перезагружается форма.
Вы комментируете #form.save()
.
Вы должны откомментировать его, чтобы он сохранился.
Ок, после почти недели попыток решить проблему и не очень большой помощи, я нашел решение! form_valid()
работает нормально, но проблема в форме. Добавление enctype
устраняет проблему:
<form method="POST" enctype="multipart/form-data">
Объяснение этому я нашел в том, что без enctype
данные изображения не передаются правильно в базу данных. Поэтому кажется, что форма работает нормально, но на заднем плане она не сохраняет изображение.