【问题标题】:why django inlineformset_factory data not saving in class-based updateview?为什么 django inlineformset_factory 数据不保存在基于类的更新视图中?
【发布时间】:2021-05-20 23:06:16
【问题描述】:

inlineformset_factory 字段正在我的 html 模板中呈现。除 inlineformset_factory 字段外的其他字段数据保存。这是我的代码:

models.py

class HeaderImage(models.Model):
      header_image = models.ImageField()
      post = models.ForeignKey(Post, on_delete=models.CASCADE)

froms.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 字段保存数据。查看图片以更好地理解

【问题讨论】:

  • 你好,可以展示你的模板吗?
  • @DiegoPuente 确定。我更新了我的问题。请看

标签: django


【解决方案1】:

你可以试试这个吗?

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

【讨论】:

  • Diego Puente 我也尝试过这种方法,但没有奏效。收到此错误form_valid() takes 2 positional arguments but 3 were given
  • 您是否将self.request.FILES 添加到您的表单集中?
  • @Diego Puente 是的,我添加了
  • 您是否删除了 form_valid 的方法覆盖?因为我的答案上的树点(在顶部和底部)意味着您只需更改我放在那里的代码并保持其余部分不变。
  • Diego Puente 谢谢你的代码现在可以工作了。添加self.request.FILES 后,它起作用了
【解决方案2】:

你的数据是指你上传的文件没有被保存。模型中的图像字段需要一个位置来保存文件

header_image = models.ImageField(upload_to='some_directory/')

【讨论】:

  • 您是否也使用 MEDIA_URL 更新了 settings.py?
  • 嗨,谢谢..按照 Diego Puente 的指示解决了我的问题
  • 我在尝试上传字段时丢失了self.request.FILES
猜你喜欢
  • 2022-11-20
  • 1970-01-01
  • 1970-01-01
  • 2014-01-26
  • 2010-11-04
  • 2020-05-08
  • 2013-04-09
  • 2021-01-16
  • 1970-01-01
相关资源
最近更新 更多