Загрузка нескольких изображений в админке Django

У меня есть категория, и для каждой категории я хочу добавить несколько изображений, но что бы я ни делал, у меня есть только один файл загрузки, но я хочу иметь несколько. В моем проекте Django есть такой класс:

в моем файле модели:

class SalonSampleImages(models.Model):
    service = models.ForeignKey(Salon, on_delete=models.CASCADE)
    Category = models.ForeignKey(
        ServiceCategory, 
        on_delete=models.SET_NULL, 
        null=True, 
        blank=True, 
        verbose_name="the main service", 
        default=1
    )
    image = models.ImageField(upload_to='salon_images/', verbose_name="images")  

    def __str__(self):
        return f"images"

    class Meta:
        verbose_name = "picture"
        verbose_name_plural = "pictures"

в моем файле администратора:

class SalonSampleImagesInLineFormSet(forms.BaseInlineFormSet):
    def clean(self):
        super().clean()
        total_images = len([form for form in self.forms if form.cleaned_data and not form.cleaned_data.get('DELETE', False)])
        if total_images < 3:
            raise ValidationError("you must all at least 3 images")
        if total_images > 10:
            raise ValidationError("you cannot add more than 10 images")
        
class SalonSampleImagesInLine(admin.TabularInline):
    model = SalonSampleImages
    formset = SalonSampleImagesInLineFormSet
    extra = 1

и я зарегистрировал всех

Затем я создал файл модели:

class MultiFileInput(forms.ClearableFileInput):
    allow_multiple_selected = True

    def __init__(self, attrs=None):
        if attrs is None:
            attrs = {}
        attrs.setdefault('multiple', 'multiple')
        super().__init__(attrs=attrs)

    def value_from_datadict(self, data, files, name):
        return files.getlist(name)

class MultiImageUploadForm(forms.Form):
    category = forms.ModelChoiceField(
        queryset=ServiceCategory.objects.all(),
        label="choose category"
    )
    images = forms.FileField(
        widget=MultiFileInput(),  
        label="upload pictures"
    )

Затем я создал html-файл:

{% extends "admin/base_site.html" %}

{% block content %}
  <h1>{{ title }}</h1>
  <form method="post" enctype="multipart/form-data">
    {% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="save the image" class="default">
  </form>
{% endblock %}

и мой settings.py:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR / 'templates'],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

Насколько мне известно, интерфейс администратора Django не поддерживает загрузку нескольких файлов "из коробки", однако вы можете преодолеть это ограничение, установив стороннюю библиотеку для сортировки файлов
выход - django-admin-multiupload с помощью pip для его установки.
Обновите свой файл admin.py, чтобы использовать этот код вместо него.

``py

from django.contrib import admin
from admin_multiupload.admin import MultiUploadAdmin
from <myapp>.models import SalonSampleImages

class SalonSampleImagesAdmin(MultiUploadAdmin):
    list_display = [
        'service',
        'category',
        'image'
    ]
    list_filter = [
        'service',
        'category'
    ]

    def process_upload_file(self, uploaded, instance, request):
        'Process the salon uploaded file'
        pass

admin.site.register(SalonSampleImages, SalonSampleImagesAdmin)


# For your forms code, you need to modify it to enable user upload 
 multiple files at a time with the usage of widget and FileField class

from django import forms
class MultiImageUploadForm(forms.Form):
    category = forms.ModelChoiceField(
        queryset=ServiceCategory.objects.all(),
        label='choose category you want'
    )
    images = forms.FileField(
        widget=forms.ClearableFileInput(attrs={'multiple': True}),
        label='upload pictures'
    )

ПРИМЕЧАНИЕ: если вы хотите применить класс multi image form, который мы создали , вам нужно создать функцию просмотра для этого, и вы должны использовать getList QueryDict запроса.ФАЙЛЫ являются частью django. Если вам понадобится какая-либо помощь оттуда, все равно дайте нам знать, а пока давайте сосредоточимся на вашем вопросе об интерфейсе администратора, на который я ответил выше.

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