Добавление изображений статей в собственную папку
Есть приложение django (называется rigs) и возможность добавления записей на сайт через models.py. Нужно сделать так, что бы при добавлении новой записи на сайт её изобрежения помещались в новую папку с названием самой статьи. Например, я добавляю статью с названием "Bee rig" и все изображения из неё помещаются в папку под названием "Bee rig" по пути media/rigs/Bee rig/image_0.png. Есть ли возможность реализации данной задумки? Вот models.py:
class Rig(models.Model):
title = models.CharField(max_length=100)
text = models.TextField()
image_0 = models.ImageField(upload_to='rigs', null=True, blank=True, default='/default_rig_image.png')
image_1 = models.ImageField(upload_to='rigs', null=True, blank=True, default='/default_rig_image.png')
image_2 = models.ImageField(upload_to='rigs', null=True, blank=True, default='/default_rig_image.png')
version = models.ForeignKey(Version, on_delete=models.SET_NULL, null=True)
is_vanila = models.BooleanField(default=True)
price = models.DecimalField(max_digits=4, decimal_places=2, default=0.00)
date = models.DateTimeField(default=timezone.now)
def __str__(self):
return(self.title)
def get_absolute_url(self):
return reverse('rig_detail', kwargs={'pk': self.pk})
Ответ на 1 комментарий
Сделал следующим образом:
def rig_directory_path_0(instance, filename):
return ('{}/{}').format(instance.title, 'image_0.png')
def rig_directory_path_1(instance, filename):
return ('{}/{}').format(instance.title, 'image_1.png')
def rig_directory_path_2(instance, filename):
return ('{}/{}').format(instance.title, 'image_2.png')
и прописал следующие пути для моделей:
image_0 = models.ImageField(upload_to='rig_directory_path_0', null=True, blank=True, default='/default_rig_image.png')
image_1 = models.ImageField(upload_to='rig_directory_path_1', null=True, blank=True, default='/default_rig_image.png')
image_2 = models.ImageField(upload_to='rig_directory_path_2', null=True, blank=True, default='/default_rig_image.png')
Но при таком розкладе у меня в корневой папке /media создаются папки с названиями /rig_directory_path_0/ и т.д.
P.S 2
Вот верхняя часть файла views.py:
from django.shortcuts import render
from django.views.generic import ListView, DetailView, CreateView, UpdateView, DeleteView
from .models import Rig
from django.contrib.auth.mixins import LoginRequiredMixin
def directory_path(instance, filename):
return ('{}/{}').format(instance.title, filename)
class ShowRigView(ListView):
model = Rig
template_name = 'rigs/rigs.html'
context_object_name = 'rig'
ordering = ['-date']
paginate_by = 15
def get_context_data(self, **kwards):
ctx = super(ShowRigView, self).get_context_data(**kwards)
ctx['title'] = 'MCStore Rigs'
return ctx
...
Вот как я сделал:
models.py:
def directory_path(instance, filename):
return ('rigs/{}/{}').format(instance.title, filename)
Всем ImageField и FileField файлам прописал:
image_0 = models.ImageField(upload_to=directory_path, null=True, blank=True, default='/default_rig_image.png')
image_1 = models.ImageField(upload_to=directory_path, null=True, blank=True, default='/default_rig_image.png')
image_2 = models.ImageField(upload_to=directory_path, null=True, blank=True, default='/default_rig_image.png')
file = models.FileField(upload_to=directory_path, null=True, blank=True)
В итоге файлы помещаются по пути: media/rigs/{название статьи}/{название файла}
Ответы (1 шт):
Чтобы это реализовать, нужно сделать функцию для создания пути сохранения файла:
# upload_to автоматом передаёт сюда объект и имя загружаемой картинки
def directory_path(instance, filename):
return ('{}/{}').format(instance.title, filename)
class Rig(models.Model):
# в upload_to подставляем функцию
image_0 = models.ImageField(upload_to=directory_path, null=True, blank=True, default='/default_rig_image.png')
Но если хотите фиксированно называть картинки image_0, image_1 и т.д., видимо придётся сделать три отдельные функции для каждого поля типа таких:
# для image_0.png
def directory_path(instance, filename):
return ('{}/{}').format(instance.title, 'image_0.png')