【问题标题】:How to output the full path of a FilePathField in Django?如何在 Django 中输出 FilePathField 的完整路径?
【发布时间】:2019-12-29 22:23:44
【问题描述】:

考虑以下模型:

STOCK_IMAGE_DIR = os.path.join(settings.MEDIA_ROOT, 'stock_images')

class Product(models.Model):
    stock_image = models.FilePathField(path=STOCK_IMAGE_DIR, default='image.png')

访问产品的stock_image时,只返回图片的名称:

>>> p = Product.objects.first()
>>> p.stock_image
'image.png'

如何输出文件的整个路径?

【问题讨论】:

标签: python django python-3.x django-models


【解决方案1】:
import os
p = Product.objects.first()
print(os.path.join(Product._meta.get_field('stock_image').path, p.stock_image))

或者

print(os.path.join(STOCK_IMAGE_DIR, p.stock_image))

或者,如果您将路径存储在类中,您可以添加一个属性来获取完整路径

class Product(models.Model):

    STOCK_IMAGE_DIR = os.path.join(settings.MEDIA_ROOT, 'stock_images')

    stock_image = models.FilePathField(path=STOCK_IMAGE_DIR, default='image.png')

    @property
    def stock_image_path(self):
        return os.path.join(self.STOCK_IMAGE_DIR, self.stock_image)

那么你就可以使用该属性了

p = Product.objects.first()
print(p.stock_image_path)

【讨论】:

  • 谢谢,但这肯定看起来很乱。这似乎违背了FilePathField 的目的。
  • 我同意,这很混乱。我不认为这个领域经常被使用,所以有点不发达
  • 最好将路径存储在类/模型上,以便您可以更轻松地引用它
  • @ReinstateMonica 用我认为更好的解决方案更新了答案
【解决方案2】:

虽然@IainShelvington 提供了获取路径的解决方案,但您可能希望使用FileField field [Django-doc],或者如果您使用图像,就像stock_image 所暗示的名称一样,使用ImageField field [Django-doc]

如果你这样建模:

STOCK_IMAGE_DIR = os.path.join(settings.MEDIA_ROOT, 'stock_images')

class Product(models.Model):
    stock_image = models.ImageField(upload_to=STOCK_IMAGE_DIR, default='image.png')

那么some_product.stock_image 将是ImageFieldFile [GitHub]。这是一个模仿File 的对象,并且具有例如path 属性来获取文件存储的路径:

some_product.stock_image<b>.path</b>

此外,FileFieldImageField 可以更方便地处理您上传图像的表单,此外,它们还有一个 .url 属性来获取 URL,以便服务器可以提供媒体文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-01
    • 2021-06-14
    • 2021-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-17
    • 1970-01-01
    相关资源
    最近更新 更多