Как получить путь к изображению при применении UUID к имени файла изображения
В своем проекте Django я реализовал функцию, которая применяет к изображениям имя, основанное на UUID. Функция используется в качестве параметра 'upload_to' для поля ImageField в моей модели 'Image'. Вот код:
models.py
def image_file_path(instance, filename):
"""Generate file path for new image"""
ext = os.path.splitext(filename)[1]
filename = f'{uuid.uuid4()}{ext}'
return f'{instance.category.name}-{filename}'
class Image(models.Model):
"""Image model"""
user = models.ForeignKey(get_user_model(), on_delete=models.CASCADE)
category = models.ForeignKey('category', on_delete=models.PROTECT, null=False, blank=False)
image = models.ImageField(
upload_to=image_file_path,
null=False,
blank=False
)
results = models.TextField(default=None)
created_at = models.DateTimeField(auto_now_add=True)
def calculate_results(self):
from .preprocessing.brain.preprocess_image import get_image_results
print("Image URL:", self.image) # Returns the original image name
self.results = get_image_results(self.image.path, target_size=(150, 150))
return self.results
def __str__(self):
return f"{self.category.name}-{self.created_at}"
views.py
@method_decorator(login_required(login_url='login'), name='dispatch')
class CreateImageView(CreateView):
model = Image
form_class = ImageForm
template_name = 'home.html'
success_url = reverse_lazy('upload_homepage')
def form_valid(self, form):
form.instance.user = self.request.user
form.instance.calculate_results()
return super().form_valid(form)
templates/home.html
{% if image %}
<img src="/static/media/{{ image.url }}">
{% endif %}
Однако, когда я пытаюсь получить доступ к image.url в файле home.html, я получаю оригинальное имя изображения при загрузке, а не то, которое было сгенерировано новым UUID. Как я могу изменить это, чтобы получить правильное имя для отображения в шаблоне?
Попробуйте image.image.url
Вам не нужно /static/media/
Вы, похоже, используете префикс /static/media/
для рендеринга изображения в templates/home.html
. Поскольку вы загружаете изображение в ImageField
, в этом нет необходимости.
Вам нужно {{ image.image.url }}
(для отображения полного URL изображения) & {{ image.image.path }}
(для отображения пути к файлу изображения).
# templates/home.html
{% if image %}
<img src="{{ image.url }}">
{% endif %}