0

I have multiple images in my product model. I got parts from here: multiple images

I want to change old images to new when I use change_view.

Here's my model.py:

class Product(models.Model):
    title = models.CharField(max_length = 45)
    description = models.TextField(null = True)

    image = models.ImageField(upload_to = 'store/full/', null = True, blank = True)

    def __str__(self):
        return self.title

    class Meta:
        ordering = ['title']
        verbose_name = "Product"
        verbose_name_plural = "Products"


def get_image_filename(instance, filename):
    title = instance.product.title
    idd = instance.product.id
    slug = slugify(title)
    return "store/additional//%s-%s-%s" % (idd, slug, filename)


class ProductImage(models.Model):
    product = models.ForeignKey(Product, default = None, on_delete = models.CASCADE, related_name = 'image_set')
    image = models.ImageField(upload_to = get_image_filename, verbose_name = 'Image')

Here's my views.py:

def create_view(request):
    ImageFormSet = modelformset_factory(ProductImage, form = ProductImageForm, extra = 4)

    form = ProductForm()
    if request.method == 'POST':
        form = ProductForm(request.POST, files = request.FILES)
        formset = ImageFormSet(request.POST, files = request.FILES, queryset = ProductImage.objects.none())
        if form.is_valid() and formset.is_valid():
            obj = form.save(commit = False)
            obj.save()

            for form in formset.cleaned_data:
                if form:
                    image = form['image']
                    photo = ProductImage(product = obj, image = image)
                    photo.save()
            messages.success(request, "Created!")

            return redirect('shop.all')
        else:
            print(form.errors, formset.errors)
    else:
        formset = ImageFormSet(queryset = ProductImage.objects.none())
    context = {
        'form': form, 'formset': formset
    }
    return render(request, 'shop/products/create.html', context)


def change_view(request, id):
    obj = get_object_or_404(Product, id = id)
    ImageFormSet = modelformset_factory(ProductImage, form = ProductImageForm, extra = 4)
    form = ProductForm(instance = obj)
    if request.method == 'POST':
        form = ProductForm(request.POST, files = request.FILES, instance = obj)
        formset = ImageFormSet(request.POST, files = request.FILES, queryset = ProductImage.objects.none())
        if form.is_valid():
            obj = form.save(commit = False)
            obj.save()
            for form in formset.cleaned_data:
                if form:
                    image = form['image']
                    photo = ProductImage(product = obj, image = image)
                    photo.save()
            return redirect('shop.detail', obj.id)
    else:
        formset = ImageFormSet(queryset = ProductImage.objects.filter(product__id=id))
    context = {
        'form': form, 'formset': formset
    }
    return render(request, 'shop/products/create.html', context)

My create.html file:

{% extends 'shop/layouts/layer.html' %}

{% block container %}

    <div>
        <form method="post" enctype="multipart/form-data">{% csrf_token %}
            {{ form.as_p }}
            {{ formset.management_form }}

            {% for form in formset %}
                {{ form.as_p }}
            {% endfor %}
            <input type="submit" value="Submit">
        </form>
    </div>

{% endblock %}

The question is 'How can I edit old "ProductImage" models on change_view and delete old image from "ProductImage"'.

Dragon-LV
  • 1
  • 1
  • 4

1 Answers1

0

I found solution.

views.py:

def change_view(request, id):
    obj = get_object_or_404(Product, id = id)
    ImageFormSet = modelformset_factory(ProductImage, form = ProductImageForm, extra = 4)
    form = ProductForm(instance = obj)
    if request.method == 'POST':
        form = ProductForm(request.POST, files = request.FILES, instance = obj)
        formset = ImageFormSet(request.POST, files = request.FILES,
                               queryset = ProductImage.objects.filter(product__id = id))
        if form.is_valid():
            obj = form.save(commit = False)
            obj.save()
            for form in formset.cleaned_data:
                if form:
                    image = form['image']
                    id = form['id'].id
                    photo = ProductImage.objects.get(id = id)
                    if photo.image != image:

                        photo.image.delete(save = True)
                        photo.image = image
                        photo.save()
                        print('Done')
                    else:
                        print('Dropped')
            return redirect('shop.detail', obj.id)
    else:
        formset = ImageFormSet(queryset = ProductImage.objects.filter(product__id = id))
    context = {
        'form': form, 'formset': formset
    }
    return render(request, 'shop/products/create.html', context)
Dragon-LV
  • 1
  • 1
  • 4