Django CreateView 不保存对象也不给出错误
Posted
技术标签:
【中文标题】Django CreateView 不保存对象也不给出错误【英文标题】:Django CreateView doesn't save object and doesn't give error 【发布时间】:2022-01-19 00:31:10 【问题描述】:我正在开发一个新项目,但在从用户页面添加新对象时遇到了困难。它可以从管理仪表板添加。 这是模型:
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() # tried this too and it didn't work
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() 中。他们都没有工作。所以我可以打开表格并填写字段。当我发送它时,该对象没有保存,但它没有给出任何错误。它只是重新加载表单。
【问题讨论】:
请正确缩进你的类。 @bichanna 完成!谢谢你的注意:) 在你的form_valid中,先尝试save(commit=False),然后添加owner字段,最后调用supers form_valid @DavidJayBrady 尝试过:form.save(commit=False) form.instance.owner = self.request.user return super().form_valid(form) 但没有用 【参考方案1】:好的,经过将近一周的尝试解决问题但没有太多帮助,我找到了解决方案! form_valid()
工作正常,但问题出在形式上。添加 enctype
可以解决问题:
<form method="POST" enctype="multipart/form-data">
我找到的解释是,没有enctype
,图像数据没有正确传递到数据库。所以看起来表单很好,但在后台它没有保存图像。
【讨论】:
以上是关于Django CreateView 不保存对象也不给出错误的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Django 的 CreateView 提交操作中保存当前登录的用户名?
Django Createview根据外键的id保存表单并重定向到页面
Django:我可以以相同的形式使用 CreateView 和 DeleteView 吗?
Django:如何在新模板中的另一个模型上使用 CreateView 的 form_valid() 返回的响应?