@HamaVari

Мне надо добавить возможность добавлять сразу несколько images за раз в админке, как это реализовать?

Мне надо добавить возможность добавлять сразу несколько images за раз в админке. Я использовал inline поле, но оно по одному объекту добавляет, я хочу добавлять сразу несколько изображений, по этому решил использовать form и вроде оно работает как надо, но есть нюанс, мне нужно по нажатию как это можно делать с inline полем чтобы еще одна форма добавлялась и можно было еще набор images добавить или удалить. Вот код:
class MultipleFileInput(forms.ClearableFileInput):
    allow_multiple_selected = True


class MultipleFileField(forms.FileField):
    def __init__(self, *args, **kwargs):
        kwargs.setdefault("widget", MultipleFileInput())
        super().__init__(*args, **kwargs)

    def clean(self, data, initial=None):
        single_file_clean = super().clean
        if isinstance(data, (list, tuple)):
            result = [single_file_clean(d, initial) for d in data]
        else:
            result = single_file_clean(data, initial)
        return result


class ProductForm(forms.ModelForm):
    images = MultipleFileField(required=False)  # Поле для загрузки нескольких изображений

    class Meta:
        model = Product
        fields = [
                  'name', 
                  'category', 
                  'price', 
                  'stock_quantity', 
                  'is_new', 
                  'is_on_sale',
                  'colors',
                  'sizes',
                  'description',
                  'compositions',
                  'images',
                  ]  

    def clean_images(self):
        images = self.cleaned_data.get('images')
        if isinstance(images, list):
            return images
        return []
    

class ProductAdmin(admin.ModelAdmin):
    list_display = (
        "name",
        "category",
        "price",
        "stock_quantity",
        "is_new",
        "is_on_sale",
        "popularity",
    )
    search_fields = ("name", "slug", "category__name")
    list_filter = ("category", "is_new", "is_on_sale")
    #inlines = [ProductImageInline]

    exclude = ["popularity", "is_on_sale", "slug"]
    filter_horizontal = ("sizes", "colors", "compositions") 

    form = ProductForm  

    def save_model(self, request, obj, form, change):
        super().save_model(request, obj, form, change)

        images = form.cleaned_data.get('images')
        if images:
            for image in images:
                if image:
                    ProductImage.objects.create(product=obj, image=image)

admin.site.register(Product, ProductAdmin)


Вот примерно что я имею ввиду, но оно через инлайн поле не работает:
673d4661a13cf577687961.jpeg
  • Вопрос задан
  • 143 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы