django встроенный набор форм с представлением на основе класса UpdateView - PullRequest
0 голосов
/ 01 мая 2020

я создал веб-блог с 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
        ] 

my views.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>

он сохраняет только форму сообщения, а не изображения, это не влияет на форму изображения благодаря

...