django - 为什么 django inlineformset_factory 数据不保存在基于类的更新视图中?
问题描述
inlineformset_factory 字段正在我的 html 模板中呈现。除 inlineformset_factory 字段外的其他字段数据保存。这是我的代码:
模型.py
class HeaderImage(models.Model):
header_image = models.ImageField()
post = models.ForeignKey(Post, on_delete=models.CASCADE)
来自s.py
BlogImageFormSet = inlineformset_factory(Post, # parent form
HeaderImage, # inline-form
fields=['header_image'] ,can_delete=False, extra=1)
#views.py
class BlogUpdateView(PermissionRequiredMixin,UpdateView):
raise_exception = True
permission_required = "blog.change_post"
model = Post
template_name = "blog_update_post.html"
form_class = BlogPost
def get_success_url(self):
self.success_url = 'http://127.0.0.1:8000/blog'
return self.success_url
def get_context_data(self, **kwargs):
context = super(BlogUpdateView, self).get_context_data(**kwargs)
if self.request.POST:
context['form'] = BlogPost(self.request.POST, instance=self.object)
context['ingredient_form'] = BlogImageFormSet(self.request.POST, instance=self.object)
else:
context['form'] = BlogPost(instance=self.object)
context['ingredient_form'] =BlogImageFormSet(instance=self.object)
return context
def post(self, request, *args, **kwargs):
self.object = self.get_object()
form_class = self.get_form_class()
form = self.get_form(form_class)
ingredient_form = BlogImageFormSet(self.request.POST)
if (form.is_valid() and ingredient_form.is_valid()):
return self.form_valid(form, ingredient_form)
else:
return self.form_invalid(form, ingredient_form)
def form_valid(self, form, ingredient_form):
self.object = form.save()
ingredient_form.instance = self.object
ingredient_form.save()
return HttpResponseRedirect(self.get_success_url())
def form_invalid(self, form, ingredient_form):
return self.render_to_response(
self.get_context_data(form=form,
ingredient_form=ingredient_form,
))
#html
<form method="POST" enctype="multipart/form-data">
{% csrf_token %}
{{form.media}}
{{form.as_p}}
{{ingredient_form}}
<button class="btn btn-info">Update</button>
</form>
解决方案
你能试试这个吗?
class BlogUpdateView(PermissionRequiredMixin,UpdateView):
...
def get_context_data(self, **kwargs):
context = super(BlogUpdateView, self).get_context_data(**kwargs)
if self.request.POST:
context['form'] = BlogPost(self.request.POST, instance=self.object)
# this line below changed
context['ingredient_form'] = BlogImageFormSet(self.request.POST, self.request.FILES, instance=self.object)
else:
context['form'] = BlogPost(instance=self.object)
context['ingredient_form'] =BlogImageFormSet(instance=self.object)
return context
def post(self, request, *args, **kwargs):
self.object = self.get_object()
form_class = self.get_form_class()
form = self.get_form(form_class)
# this line below changed
ingredient_form = BlogImageFormSet(self.request.POST, self.request.FILES)
if (form.is_valid() and ingredient_form.is_valid()):
return self.form_valid(form, ingredient_form)
else:
return self.form_invalid(form, ingredient_form)
...
推荐阅读
- php - 查询性能改进 - 在 CakePHP 3.0 中收集 user_activities
- php - 如何在同一页面 header.php 中获取会话值动态另一个 url?
- python - conda虚拟环境中的tensorflow安装失败-windows
- ubuntu - 我在 Ubuntu 19.10 中所做的一切都需要身份验证
- python - 如何将 RegEx 模式传递给 Pytesseract?
- networking - Rancher 无法从另一个项目连接集群 IP
- swift - 如果检测到多个透明平面,延迟阴影不起作用
- kubernetes-helm - Helm Chart:如何先安装依赖项?
- python - 如何从python将图像保存在django媒体根存储中
- google-home - 无法从 HomeGraph 获取设备列表:未找到请求的实体