【问题标题】:To use Django FileField or FilePathField?使用 Django FileField 或 FilePathField?
【发布时间】:2016-01-09 10:14:49
【问题描述】:

我对使用哪个字段有点困惑。我需要的只是一个可以保存文件(音频和/或图像的另一个)的字段

FileField 似乎是专门用于上传的,我认为这对于我需要的东西来说有点矫枉过正,我也不喜欢它每次都会自动上传文件并将文件重命名为唯一的文件名 (file_FHjgh758.txt)上传了一些东西。

我对 FilePathField 的问题是它似乎需要一个绝对路径,这显然不同于从开发到生产,我通过将它添加到模型中解决了这个问题...

import os

class Foo(models.Model):

    path = os.path.dirname(os.path.dirname(__file__))
    path = os.join(path, 'media')
    audio = models.FilePathField(path=path)

我不知道这是否安全或适当,并且在线或文档中没有太多示例可供参考。

明确地说,我只想有一个可以指向系统某处的文件(音频或图像)的字段。这样做的最佳方法是什么?

【问题讨论】:

    标签: django


    【解决方案1】:

    如果您想引用文件系统上已经存在的文件而不是用户上传的文件,那么FilePathField 就是您想要的。

    这方面的几个cmets:

    • 不要指向应用源代码树内的路径。这不安全。

    • 您可以使用设置或环境变量来处理开发路径与生产路径,例如,将 FILE_PATH_FIELD_DIRECTORY 设置放在您的开发/生产设置文件中,然后在您的应用中引用此设置:

      from django.conf import settings
      
      class Foo(models.Model):
          audio = models.FilePathField(path=settings.FILE_PATH_FIELD_DIRECTORY)
      

    【讨论】:

    • 感谢您的回答,这对我来说很有意义,尽管我被困在如何从模板调用文件位置。如果我调用保存在数据库中的 url,它类似于 '/home/../../' 并且 html 会尝试使其相对于不正确的开发服务器。我想我在这里遗漏了一些明显的东西
    • 我认为问题在于FilePathField 更适用于位于您的服务器上且无法通过 Web 服务器访问的文件...如果您想公开文件,那么您最好使用 @ 987654327@ 具有url 属性,并且还将文件保存在可访问的位置(在您的MEDIA_ROOT 中)。您可以覆盖FileField 的保存行为以防止随机后缀。
    • 感谢您的跟进,如果我没记错的话,我还应该在 urls.py 中输入一个视图来处理进入 /media 文件夹的请求吗?这是正确的还是危险的?
    • Django 无法处理对静态文件和媒体的请求——它希望你配置你的网络服务器来做到这一点——参见the extensive documentation 处理静态文件。您的urls.py 应该只包含 Django 生成的动态内容的 URL(in development 除外)。
    • 设置放在哪里?在哪个文件中?
    猜你喜欢
    • 2018-01-10
    • 2017-06-01
    • 1970-01-01
    • 2013-04-19
    • 2020-02-20
    • 2012-03-09
    • 1970-01-01
    • 2011-09-08
    • 2013-04-09
    相关资源
    最近更新 更多