Создание форм редактирования modelformset_factory

Последние несколько месяцев я изучаю django и работаю над проектом электронной коммерции, чтобы продолжить свое обучение, но в последнее время меня совершенно поставила в тупик проблема, с которой я столкнулся.

Я использую ForeignKey для добавления нескольких изображений к каждому товару, и в настоящее время у меня есть форма, которая позволяет мне создать пост и добавить в него до 20 изображений. Я нашел в Интернете некоторую помощь, чтобы заставить эту форму работать, и много изучал ее, чтобы убедиться, что я понимаю ее, но когда я попытался сделать ее в форме редактирования, я полностью потерялся.

Вот мой код

models.py

from django.db import models
from django.template.defaultfilters import slugify

from users.models import User


# Create your models here.

def get_thumbnail_filename(instance, filename):
    title = instance.name
    slug = slugify(title)
    return "post_images/%s-%s" % (slug, filename)  



class Product(models.Model):
    seller = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
    name = models.CharField(max_length=200)
    description = models.TextField()
    created = models.DateTimeField(auto_now_add=True)
    price = models.FloatField()
    thumbnail = models.ImageField(upload_to=get_thumbnail_filename, null=True)
    
    def __str__(self):
        return self.name



def get_image_filename(instance, filename):
    title = instance.product.name
    slug = slugify(title)
    return "post_images/%s-%s" % (slug, filename)  



class Images(models.Model):
    product = models.ForeignKey(Product, default=None, on_delete=models.CASCADE, null=True)
    img = models.ImageField(upload_to=get_image_filename,
                              verbose_name='Image')
    class Meta:
        verbose_name_plural = "Images"

views.py

@login_required
def add_product(request):
 
    ImageFormSet = modelformset_factory(Images,
                                        form=ImageForm, extra=20)
    #'extra' means the number of photos that you can upload   ^
    if request.method == 'POST':
    
        postForm = ProductForm(request.POST, request.FILES)
        formset = ImageFormSet(request.POST, request.FILES,
                               queryset=Images.objects.none())
    
    
        if postForm.is_valid() and formset.is_valid():
            post_form = postForm.save(commit=False)
            post_form.user = request.user
            post_form.save()
    
            for form in formset.cleaned_data:
                #this helps to not crash if the user   
                #do not upload all the photos
                if form:
                    image = form['img']
                    photo = Images(product=post_form, img=image)
                    photo.save()
            # use django messages framework
            messages.success(request,
                             "Yeeew, check it out on the home page!")
            return HttpResponseRedirect("/")
        else:
            print(postForm.errors, formset.errors)
    else:
        postForm = ProductForm()
        formset = ImageFormSet(queryset=Images.objects.none())
    return render(request, 'core/product-form.html',
                  {'postForm': postForm, 'formset': formset})

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

@login_required
def edit_product(request, pk):
    pro_in = get_object_or_404(Product, id=pk) 
    ImageFormSet = modelformset_factory(Images, fields='__all__', extra=20, max_num=20)
            #'extra' means the number of photos that you can upload   ^
    
    if request.method == 'GET':
        context = {'postForm': ProductForm(instance=pro_in), 'formset':ImageFormSet(queryset=Images.objects.filter(product_id=pk))}
        return render(request, 'core/product-form.html', context)

    if request.method == 'POST':
    
        postForm = ProductForm(request.POST, request.FILES, instance=pro_in)
        formset = ImageFormSet(request.POST, request.FILES, queryset=Images.objects.filter(product_id=pk))
    
    
        if postForm.is_valid() and formset.is_valid():
            post_form.save()
            fromset.save()
    
            # use django messages framework
            messages.success(request,
                             "Yeeew, check it out on the home page!")
            return HttpResponseRedirect("/")
        else:
            print(postForm.errors, formset.errors)
    else:
        postForm = ProductForm()
        formset = ImageFormSet(queryset=Images.objects.none())
    return render(request, 'core/product-form.html',
                  {'postForm': postForm, 'formset': formset})

Если вам нужно посмотреть мои forms.py, или urls.py, просто спросите.

Любая помощь будет высоко оценена!

Вернуться на верх