Django Admin загружает изображение с внешним ключом

У меня есть модель Product с User и ProductImages в качестве внешнего ключа.

models.py

class User(AbstractBaseUser):
    ...


class ProductImages(models.Model):
    image_type = models.CharField(max_length=33,default='image_type')    
    image_file = models.ImageField(
        upload_to='images/',
        null=True,
        blank=True,
        default='magickhat-profile.jpg'
    )


class Product(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    productimages = models.ForeignKey(ProductImages, on_delete=models.CASCADE)
    product_title = models.CharField(max_length=255, default='product_title')    
    product_description = models.CharField(max_length=255, default='product_description')    
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    is_active = models.BooleanField(default=True)
    product_view = models.IntegerField(default=0) 

    def __str__(self):
        return self.product_title
    
    def get_absolute_url(self):
        return reverse('product_change', kwargs={'pk': self.pk})

forms.py

class ProductForm(ModelForm):

    productimages = forms.ImageField()
     
    CHOICES_STATUS = (('Pronto', 'Pronto'),('Em obras', 'Em obras'),('Lançamento', 'Lançamento'),)
    product_status = forms.ChoiceField(choices=CHOICES_STATUS)
    product_title = forms.CharField()    
    product_description = forms.CharField()  
    
    class Meta:
        model = Product
        fields = '__all__'

admin.py

class AdminProductModel(admin.ModelAdmin):
    
    def get_queryset(self, request):
        qs = super().get_queryset(request)
        return qs.filter(user_id=request.user)

kadmin.register(User, UserAdmin)
kadmin.register(Product, AdminProductModel)

Но в модели администратора Product поле для изображения отображается как select field нет ImageField

Моя цель - добавить upload image field на django администрирование модели.

Если я использую ImageField direct в модели Product поле редактируется нормально, но мне нужна внешняя таблица для хранения этого изображения, потому что это загрузка нескольких изображений, поэтому мне нужен правящий ключ.

Как правильно подойти к этой цели.

Я вижу другие вопросы об этом, но большинство - старые версии, и не для пользовательских AdminSite, как я.

Django 3.2 version Class View Based

Как было предложено в комментариях, я изменяю отношения между моделями следующим образом:

uptade

models.py

class Product(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    product_title = models.CharField(max_length=255, default='product_title')    
    product_description = models.CharField(max_length=255, default='product_description')    
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    is_active = models.BooleanField(default=True)
    product_view = models.IntegerField(default=0) 

    def __str__(self):
        return self.product_title

    def get_absolute_url(self):
        return reverse('product_change', kwargs={'pk': self.pk})

class ProductImages(models.Model):
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    image_type = models.CharField(max_length=33,default='image_type')    
    image_file = models.ImageField(
        upload_to='images/',
        null=True,
        blank=True,
        default='magickhat-profile.jpg'
    )

Теперь мой вопрос в том, как перенести это поле image_file из ProducImages в ProductForm?

Предполагаю, что вы хотите иметь возможность публиковать несколько изображений в вашей базе данных, в таком случае вам следует использовать StackedInline для объединения двух моделей вместе, тогда вы сможете иметь несколько полей в базе данных для загрузки большего количества изображений. Вы сделаете это через admin.py следующим образом:

class ProductImagesAdmin(admin.StackedInline):
       model = ProductImages

class ProductAdmin(admin.ModelAdmin):
      # The field your want to display 
      list_display  = ['','']
      # Here you link the models together 
      inlines = [ ProductImagesAdmin]

Для загрузки нескольких изображений с фронтенда вам понадобится форма для обработки

class ProductImagesForm(forms.ModelForm):
      class Meta:
        model = ProductImages
        fields = ['image_file']
        widget = forms.ClearableFileInput(attrs={'multiple':True})

Вид для работы с несколькими изображениями

def upload_product_images(request):
    form = ProductImagesForm(request.POST, request.FILES)
    files = requests.FILES.getlist['image_file']
    title = request.POST['product_title']
    description = request.POST['descritpion']
    product = Product(product_title=title,product_description=description)
    product.save()
    # You would have to make some iterations through the list images in order topost 
    # them to your database
    if form.is_valid:
       for file in files:
           prod_image_data = ProductImages(vehicle=vehicle, image=file)
           prod_image_data.save() 
    return redirect(# redirect to anywhere you)
Вернуться на верх