как редактировать (удалять) записи из набора форм Django - PullRequest
0 голосов
/ 20 февраля 2019

Вступление: У меня есть пост, в котором может быть несколько изображений, я добиваюсь этого с помощью двух моделей, а именно.Сообщение и подготовка.Почтовая модель имеет user, title, message и post_image

class Post(models.Model):
    user = models.ForeignKey(User, related_name='posts')
    title = models.CharField(max_length=250, unique=True)    
    message = models.TextField() 
    post_image = models.ImageField(upload_to='post_images/')

Я использую другую модель для получения дополнительных изображений, называемых Prep. Это может иметь несколько изображений.

class Prep (models.Model): #(Images)
    post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='post_prep')
    image = models.ImageField(upload_to='post_prep_images/', blank=True, null=True)
    image_title = models.CharField(max_length=100)
    image_description = models.CharField(max_length=250)

Однако, в отличие от ранее, каждое из изображений из подготовительной модели имеет image_title и image_description

Проблема: Я могу создатьсообщение успешно, а также почти редактировать сообщение с одним исключением Я не могу уменьшить количество изображений.

  • Если у меня есть 3 подготовительных изображения, я могу добавить больше изображений до максимально допустимого
  • Я могу редактировать существующие изображения

    • Я не могу уменьшить количество подготовительных изображений

    Я получаю сообщение об ошибке в форме This field is required.

Как исправить эту ошибку

мой пост_редактный просмотр

def post_edit(request, slug):
    post = get_object_or_404(Post, slug=slug)
    ImageFormSet = modelformset_factory(Prep, fields=('image', 'image_title', 'image_description'), extra=7, max_num=7,
                                        min_num=2)
    if post.user != request.user:
        raise Http404()
    if request.method == "POST":
        form = PostEditForm(request.POST or None, request.FILES or None, instance=post)
        formset = ImageFormSet(request.POST or None, request.FILES or None)

        if form.is_valid() and formset.is_valid():
            form.save()
            data = Prep.objects.filter(post=post)
            for index, f in enumerate(formset):
                if f.cleaned_data:
                    if f.cleaned_data['id'] is None:
                        photo = Prep(post=post, image=f.cleaned_data.get('image'), image_title=f.cleaned_data.get('image_title'),
                                     image_description=f.cleaned_data.get('image_description'))
                        photo.save()

                   #I thought the below code will do the trick but it doesn't seem to be    
                    elif f.cleaned_data['image'] is False or f.cleaned_data['image_title'] is False or f.cleaned_data['image_description'] is False:
                        photo = Prep.objects.get(id=data[index].id)
                        photo.image.delete()
                        photo.image_title.delete()
                        photo.image_description.delete()
                        photo.id.delete()    

                    else:
                        photo = Prep(post=post, image=f.cleaned_data.get('image'), image_title=f.cleaned_data.get('image_title'),
                                     image_description=f.cleaned_data.get('image_description'))
                        d = Prep.objects.get(id=data[index].id)
                        d.image=photo.image
                        d.image_title=photo.image_title
                        d.image_description=photo.image_description
                        d.save()

            return HttpResponseRedirect(post.get_absolute_url())
    else:
        form = PostEditForm(instance=post)
        formset = ImageFormSet(queryset=Prep.objects.filter(post=post))
    context = {'form': form, 'post': post, 'formset': formset}
    return render(request, 'posts/post_edit.html', context)

1 Ответ

0 голосов
/ 20 февраля 2019

can_delete=True, в modelformset_factory

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...