首页 > 解决方案 > 为什么 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>

我不明白为什么没有为 inlineformset_factory 字段保存数据。查看图片以更好地理解 在此处输入图像描述

标签: django

解决方案


你能试试这个吗?

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

推荐阅读