Answer the question
In order to leave comments, you need to log in
Why can't I attach a picture to a product through the admin panel?
Hello, I'm trying to upload an image to a product in the admin panel, but when saving, an error appears
. Please explain what is the reason for this error and how to fix it:
An error occurred (InvalidAccessKeyId) when calling the PutObject operation: The AWS Access Key Id you provided does not exist in our records.
import random
import os
from django.conf import settings
from django.core.files.storage import FileSystemStorage
from django.db import models
from django.db.models import Q
from django.db.models.signals import pre_save, post_save
from django.urls import reverse
from ecommerce.aws.download.utils import AWSDownload
from ecommerce.aws.utils import ProtectedS3Storage
from ecommerce.utils import unique_slug_generator, get_filename
def get_filename_ext(filepath):
base_name = os.path.basename(filepath)
name, ext = os.path.splitext(base_name)
return name, ext
def upload_image_path(instance, filename):
# print(instance)
# print(filename)
new_filename = random.randint(1, 3910209312)
name, ext = get_filename_ext(filename)
final_filename = '{new_filename}{ext}'.format(new_filename=new_filename, ext=ext)
return "products/{new_filename}/{final_filename}".format(
new_filename=new_filename,
final_filename=final_filename
)
class ProductQuerySet(models.query.QuerySet):
def active(self):
return self.filter(active=True)
def featured(self):
return self.filter(featured=True, active=True)
def search(self, query):
lookups = (Q(title__icontains=query) |
Q(description__icontains=query) |
Q(price__icontains=query) |
Q(tag__title__icontains=query)
)
# tshirt, t-shirt, t shirt, red, green, blue,
return self.filter(lookups).distinct()
class ProductManager(models.Manager):
def get_queryset(self):
return ProductQuerySet(self.model, using=self._db)
def all(self):
return self.get_queryset().active()
def featured(self): # Product.objects.featured()
return self.get_queryset().featured()
def get_by_id(self, id):
qs = self.get_queryset().filter(id=id) # Product.objects == self.get_queryset()
if qs.count() == 1:
return qs.first()
return None
def search(self, query):
return self.get_queryset().active().search(query)
class Product(models.Model):
title = models.CharField(max_length=120)
slug = models.SlugField(blank=True, unique=True)
description = models.TextField()
price = models.DecimalField(decimal_places=2, max_digits=20, default=39.99)
featured = models.BooleanField(default=False)
active = models.BooleanField(default=True)
timestamp = models.DateTimeField(auto_now_add=True)
is_digital = models.BooleanField(default=False) # User Library
objects = ProductManager()
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.productfile_set = None
def get_absolute_url(self):
# return "/products/{slug}/".format(slug=self.slug)
return reverse("products:detail", kwargs={"slug": self.slug})
def __str__(self):
return self.title
def __unicode__(self):
return self.title
@property
def name(self):
return self.title
def get_downloads(self):
qs = self.productfile_set.all()
return qs
def product_pre_save_receiver(sender, instance, *args, **kwargs):
if not instance.slug:
instance.slug = unique_slug_generator(instance)
pre_save.connect(product_pre_save_receiver, sender=Product)
def upload_product_file_loc(instance, filename):
slug = instance.product.slug
# id_ = 0
id_ = instance.id
if id_ is None:
Klass = instance.__class__
qs = Klass.objects.all().order_by('-pk')
if qs.exists():
id_ = qs.first().id + 1
else:
id_ = 0
if not slug:
slug = unique_slug_generator(instance.product)
location = "product/{slug}/{id}/".format(slug=slug, id=id_)
return location + filename # "path/to/filename.mp4"
class ProductImage(models.Model):
product = models.ForeignKey(Product, blank=True, null=True, default=None)
image = models.ImageField(upload_to='product_image/', null=True, default=None)
is_main = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
created = models.DateTimeField(auto_now_add=True, auto_now=False)
updated = models.DateTimeField(auto_now_add=False, auto_now=True)
def __str__(self):
return "Заказ %s" % self.id
class Meta:
verbose_name = 'Фотография'
verbose_name_plural = 'Фотографии'
Answer the question
In order to leave comments, you need to log in
Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question