【问题标题】:how to update formset如何更新表单集
【发布时间】:2020-08-15 22:47:07
【问题描述】:

我用 django 2.2 创建了网络博客,每个帖子都有多个图像,但是当我尝试更新帖子时,图像不会更新 我使用基于类的视图

class Post(models.Model):
    user= models.ForeignKey(Account,on_delete=models.CASCADE)
    title= models.CharField(max_length=100)
    #others

class PostImage(models.Model):
    post= models.ForeignKey(Post,on_delete=models.CASCADE,related_name='images')
    media_files = models.FileField(upload_to=random_url)

这是我的 forms.py

class PostImageForm(forms.ModelForm):
    class Meta:
        model = PostImage
        fields = [
            'media_files'
        ]
class PostUpdateForm(forms.ModelForm):
    class Meta:
        model = Post
        fields = [
           'title','description',#and others
        ] 

我的意见.py

PostImageFormSet = inlineformset_factory(
Post,PostImage,form=PostImageForm,extra=1,can_delete=True,can_order=False
) 

class PostUpdateView(LoginRequiredMixin,UserPassesTestMixin,UpdateView):
    model = Post
    form_class = PostUpdateForm
    template_name = 'posts/update_post.html'
    def get_context_data(self,**kwargs):
        data = super().get_context_data(**kwargs)
        if self.request.POST:
            data['images'] = PostImageFormSet(self.request.POST or None,self.request.FILES,instance=self.object)
        else:
            data['images'] = PostImageFormSet(instance=self.object)
        return data
    def form_valid(self,form):
        context = self.get_context_data()
        images = context['images']
        with transaction.atomic():
            if form.is_valid() and images.is_valid():
                self.object = form.save()
                images.instance = self.object
                images.save()
        return super().form_valid(form)
    def test_func(self):
        post = self.get_object()
        if self.request.user.username == post.user.username:
            return True
        return False
    def get_success_url(self):
        return reverse_lazy('post:post-detail',kwargs={'slug':self.object.slug})

我的模板

<form enctype="multipart/form-data" method="post" action="">
        {% csrf_token %}
        {{images.management_form }}
        {{ form|crispy }}
        {% for img in images %}
            <label>{{img.media_files.label}}</label>
              {{img.media_files}}
        {% endfor %}
            <button type="submit" class="btn btn-block btn-primary">update</button>
    </form>

它只保存帖子形式而不是图像,它不影响图像形式 谢谢

【问题讨论】:

  • 如果没有正确测试你的代码,这行对我来说是错误的,images.instance = self.object

标签: django django-class-based-views inline-formset


【解决方案1】:

我认为而不是写作:

images.instance = self.object 

请试试这个:

我注意到你使用的表单是有效的,所以它可能会略有不同,但如果你稍微改变一下它应该可以工作。

form = PostUpdateForm(request.POST)
if form.is_valid():
    cd = form.cleaned_data
    images = cd.get('images')

或使用您当前的设置(尚未测试)

if form.is_valid() //去掉这部分->和images.is_valid():

   if form.is_valid():
        self.object = form.save()
        instance = self.object
        cd = form.cleaned_data
        images = cd.get('images')
        images.save()

【讨论】:

  • 感谢您的回复,我收到此错误 get_internal_type() missing 1 required positional argument: 'self'
  • 如果您知道另一种方式,请告诉我,我将不胜感激
  • 我刚刚注意到你的消息
  • 它在哪一行写着?
  • 其他相关的错误,我解决了,还是不能更新
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多