Django将上传的文件存储在项目目录之外

时间:2018-03-18 18:49:46

标签: django

我正在使用Django 2

我有一个模型Course来创建课程并将横幅图像上传为ImageField()

class Course(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    name = models.CharField(max_length=250)
    banner = models.ImageField(upload_to='course/%Y/%m/%d', blank=True)

位于settings

app/settings/local.py个文件中
# at top of settings file, defined BASE_DIR
BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

STATIC_URL = '/static/'

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static_dir')
]

STATIC_ROOT = os.path.join(os.path.dirname(BASE_DIR), 'static_cdn', 'static_root')

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(os.path.dirname(BASE_DIR), 'static_cdn', 'media_root')

图片上传完美,但上传的位置在项目目录之外。假设我的项目位于my_project目录中,其中包含app模块和其他模块以及static_dir来存储静态文件。 但是static_cdn目录是在my_project目录之外创建的。

我希望它在my_project目录中。

有什么问题?

  

编辑2

DEBUG = False
STATIC_URL = '/static/'

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static_dir')
]

STATIC_ROOT = os.path.join(BASE_DIR, 'static_cdn', 'static_root')

2 个答案:

答案 0 :(得分:1)

删除一个os.path.dirname()调用,应该可以正常工作

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

或者您可以保持BASE_DIR不变并更改MEDIA_ROOT和STATIC _ROOT

STATIC_ROOT = os.path.join(BASE_DIR, 'static_cdn', 'static_root') 

 MEDIA_ROOT = os.path.join(BASE_DIR, 'static_cdn', 'media_root')

我认为第二种选择是最好的

答案 1 :(得分:0)

回答编辑2

如果您有DEBUG = False,那么您正在生产模式下运行

请阅读https://docs.djangoproject.com/en/2.0/howto/static-files/deployment/

您也可以使用http://whitenoise.evans.io/en/stable/

此外,如果您设置DEBUG = True,它应该可以正常工作

建议:不要在生产中设置DEBUG = True