Как получить путь к изображению при применении 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 %}
Вернуться на верх