要使用Django FileField还是FilePathField?

del*_*lta 17 django

我对使用哪个字段感到困惑.我需要的只是一个将保存文件的字段(音频和/或另一个文件)

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)
Run Code Online (Sandbox Code Playgroud)

我不知道这是否安全或正确,并且在线或在文档中没有很多示例可供借鉴.

为了清楚起见,我只想拥有一个可以指向系统中某个文件(音频或图像)的字段.这样做最好的方法是什么?

sol*_*oke 19

如果要引用文件系统上已有的文件而不是用户上载的文件,那么FilePathField就是您想要的文件.

在这方面几点评论:

  • 不要指向应用源树中的路径.那不安全.

  • 您可以使用设置或环境变量来处理开发与生产路径,例如,FILE_PATH_FIELD_DIRECTORY在开发/生产设置文件中设置一个设置,并从您的应用程序中引用此设置:

    from django.conf import settings
    
    class Foo(models.Model):
        audio = models.FilePathField(path=settings.FILE_PATH_FIELD_DIRECTORY)
    
    Run Code Online (Sandbox Code Playgroud)

  • 我认为问题是`FilePathField`对于服务器上无法通过Web服务器访问的文件更多...如果您想要公共文件,那么最好使用具有`url`的`FileField`.属性,也将文件保存在可访问的位置(在您的`MEDIA_ROOT`中).您可以覆盖`FileField`的保存行为以防止随机后缀. (4认同)
  • 感谢您的回答,这对我来说很有意义,尽管我坚持如何从模板调用文件位置。如果我调用保存在数据库中的 url,它类似于 '/home/../../' 并且 html 尝试使其相对于不正确的开发服务器。我想我在这里遗漏了一些明显的东西 (2认同)
  • Django的无法处理的静态文件和媒体的要求 - 它希望你配置你的Web服务器来做到这一点 - 见[的大量文件(https://docs.djangoproject.com/en/1.8/howto/static-files/)处理静态文件.你`urls.py`应该只包含一个网址给Django生成动态内容(除了[发展](https://docs.djangoproject.com/en/1.8/howto/static-files/#serving-static-files-在开发)). (2认同)