Ошибка в Django - [WinError 3] Система не может найти указанный путь - Django
Проблема заключается в следующем: я пытаюсь позволить пользователям загружать 5 изображений, и при загрузке я хочу, чтобы они меняли директорию.
Пока что мой views.py
class ProductCreateView(LoginRequiredMixin, CreateView):
template_name = "product/add_product.html"
success_url = reverse_lazy('home')
form_class = ProductForm
login_url = "/login/"
# Save current user id as product_user_id in DB
def form_valid(self, form, **kwargs):
form.instance.product_user_id = self.request.user.id
response = super().form_valid(form)
id = form.instance.id
picture_1 = form.instance.product_img_1
picture_2 = form.instance.product_img_2
picture_3 = form.instance.product_img_3
picture_4 = form.instance.product_img_4
picture_5 = form.instance.product_img_5
product_title = form.instance.product_title
user = form.instance.product_user_id
# Change directory
new_directory = change_directory(id, product_title, user, picture_1, picture_2, picture_3, picture_4, picture_5)
return new_directory
utils.py
def change_directory(id, product_title, user, picture_1, picture_2, picture_3, picture_4, picture_5):
file_name = f"{id}-{product_title}-{product_title}-{user}"
new_path = os.path.join(settings.MEDIA_ROOT, "product_images", file_name)
if not os.path.exists(new_path):
os.makedirs(new_path)
picture_list = [picture_1, picture_2, picture_3, picture_4, picture_5]
for i in picture_list:
old_image_path = os.path.join(settings.MEDIA_ROOT, f"product_images/{i}")
new_image_path = os.path.join(settings.MEDIA_ROOT, f"product_images/{file_name}/{i}")
os.rename(old_image_path, new_image_path)
return new_path
Решение не за горами, но у меня нет идей.
Если это поможет:
models.py
class Product(models.Model):
product_title = models.CharField(max_length=255)
product_description = models.TextField()
product_description_short = models.CharField(max_length=255, blank=True)
product_condition = models.CharField(max_length=100)
product_code = models.CharField(max_length=100, blank=True)
product_manufacturer = models.CharField(max_length=100, blank=True)
product_location_state = models.CharField(max_length=100)
product_location_city = models.CharField(max_length=100)
product_delivery_time = models.IntegerField()
product_category = models.ForeignKey(ProductCategory, on_delete=models.CASCADE, related_name='products')
product_img_1 = models.ImageField(upload_to="product_images", blank=True)
product_img_2 = models.ImageField(upload_to="product_images", blank=True)
product_img_3 = models.ImageField(upload_to="product_images", blank=True)
product_img_4 = models.ImageField(upload_to="product_images", blank=True)
product_img_5 = models.ImageField(upload_to="product_images", blank=True)
price = models.DecimalField(max_digits=10, decimal_places=2, default=0.0)
product_user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='user')
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.product_title
forms.py
class ProductForm(ModelForm):
class Meta:
model = Product
fields = [
'product_title',
'product_description',
'product_description_short',
'product_condition',
'product_code',
'product_manufacturer',
'product_location_state',
'product_location_city',
'product_delivery_time',
'product_category',
'product_img_1',
'product_img_2',
'product_img_3',
'product_img_4',
'product_img_5',
'price'
]
Ошибка: [WinError 3] Система не может найти указанный путь: 'C:\Users\rener\OneDrive\Desktop\Web developer bootcamp\Enda projektid\Ecom\project-ecom\ecom\media\product_images/product_images/DSC_0922_yhSMaeD. JPG' -> 'C:\Users\rener\OneDrive\Desktop\Web developer bootcamp\Enda projektid\Ecom\project-ecom\ecom\media\product_images/15-Autouus-Autouus-2/product_images/DSC_0922_yhSMaeD.JPG'
Я ожидаю, что он сначала загрузит их в папку product_images, а затем переместит их в папку product_images/{имя_файла}.
После некоторого времени поиска в интернете я нашел немного другой способ сохранения изображений в папку, отличную от корневой. Это намного быстрее и проще, но, к сожалению, при таком способе у вас не будет доступа к id продукта.
Как я понимаю, нет возможности получить id товара перед его сохранением, но есть возможность получить доступ к другим полям.