如何更新表格集

问题描述 投票:0回答:1

我已经创建了Web博客与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)

还有这个 我的表单.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>

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

django django-class-based-views inline-formset
1个回答
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() /Remove this part -> and images.is_valid():

   if form.is_valid():
        self.object = form.save()
        instance = self.object
        cd = form.cleaned_data
        images = cd.get('images')
        images.save()
© www.soinside.com 2019 - 2024. All rights reserved.