Как разрешить загрузку более одного изображения на django? - PullRequest
1 голос
/ 26 мая 2020

В настоящее время у меня есть модель изображений, которая позволяет загружать изображения для каждого класса продукта (внешний ключ).

Однако я хотел бы загрузить более одного изображения для каждого продукта

Ниже показан мой models.py для изображения класса.


def get_image_filename(instance,filename):
    id = instance.product.id
    return "picture_image/%s" % (id)

def path_and_rename(instance, filename):
    upload_to = 'images'
    ext = filename.split('.'[-1])
    if instance.pk:
        filename = '{}.{}'.format(instance.pk, ext)
    else:
        filename = '{}.{}'.format(uuid4().hex, ext)
    return os.path.join(upload_to, filename)

class Picture(models.Model):
    product_pic = models.ImageField(null=True, blank=True,upload_to=path_and_rename)
    product = models.ForeignKey(Product, null=True, on_delete=models.SET_NULL )
    date_created = models.DateTimeField(auto_now_add=True, null=True)


Как разрешить загрузку более одного изображения на django?

1 Ответ

1 голос
/ 26 мая 2020

Как разрешить загрузку более одного изображения на django?

Вы уже можете . В самом деле, вы можете создать несколько объектов Picture для одного и того же Product. Например:

myproduct = Product.objects.first()
Picture.objects.create(<b>product=my_product</b>, product_pic=request.FILES['image1'])
Picture.objects.create(<b>product=my_product</b>, product_pic=request.FILES['image2'])

Таким образом, мы создаем два объекта Picture, которые ссылаются на тот же Product.

Вы можете использовать formsets , чтобы отображать форму для Picture несколько раз. Например:

from django.forms import inlineformset_factory
from django.shortcuts import redirect
from app.models import Product, Picture

def my_view(request, product_pk):
    PictureFormSet = inlineformset_factory(Product, Picture, fields=('product_pic',))
    product = Author.objects.get(pk=product_pk)
    if request.method == 'POST':
        formset = <b>PictureFormSet(</b>request.POST, request.FILES<b>, instance=product)</b>
        if formset.is_valid():
            formset.save()
            return redirect(<i>'name-of-some-view'</i>)
    else:
        formset = PictureFormSet(instance=product)
    return render(request, 'some_template.html', {'formset': formset})

и в вашем шаблоне вы затем визуализируете это с помощью:

<form enctype="multipart/form-data" method="post" action="{% url 'name-of-view' product_pk=formset.instance.pk %}">
    {% csrf_token %}
    {{ <b>formset</b> }}
</form>
...