Django FileField 和媒体配置

Django FileField and Media config

我完全受困于此,我有一个带有文件字段的简单模型:

class EmailTemplate(models.Model):
    template_name = models.CharField(max_length=100, primary_key=True, verbose_name='Template Name')
    template_file = models.FileField(upload_to=f'documents/non_voice/email_templates', verbose_name='File',
                                     validators=[validate_txt_extension])

    def __str__(self):
        return self.template_name

用户可以通过表单上传文件,以后应该可以下载它们作为参考。 上传就像一个魅力,但是当我在 django_table - Table 中显示文件时,它 links 到它的相对路径并且下载不会工作,因为它试图只提供部分文件小路。 Django 不应该自动预先设置我的 Media Dir 来构建正确的路径吗? (我无法提供完整路径,因为“upload_to”只接受相对路径!)

此外,标准上传小部件将其当前路径显示为 link,当您单击它时它也不起作用,所以我认为问题一定出在其他地方(最好的猜测是我的媒体设置...)

我的媒体设置如下所示:

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
TEMPLATE_DIR = os.path.join(BASE_DIR, 'templates')
STATIC_DIR = os.path.join(BASE_DIR, 'static')
MEDIA_DIR = os.path.join(BASE_DIR, 'media')
LOG_DIR = os.path.join(BASE_DIR, 'logs')

# MEDIA
MEDIA_ROOT = MEDIA_DIR
MEDIA_URL = '/media/'

有什么想法吗?

我认为问题出在 upload_to 值上。删除 f 字符串并在路径末尾添加正斜杠。

template_file = models.FileField(upload_to='documents/non_voice/email_templates/', verbose_name='File',
                                     validators=[validate_txt_extension])

试一试,看看是否有效

我没有发现您的 MEDIA_URLMEDIA_ROOT 设置有任何问题。

1.首先, 你在 你的应用程序的主 urls.py 中有这一行吗?

from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    # your urls
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

2。在您的模板中,您是否检索了如下文件?

 {{ yourquery.template_file.url }}

好的,我找到了问题,它再次显示了 post 所有细节,无论多么微不足道:)

问题实际上不是 Django,而是它 运行 上的 NGINX,如果你想提供媒体文件,你实际上必须让 nginx 知道它们在哪里(静态配置,这就是它们工作的原因和媒体不是...)

示例:

location /static/ {
    root /EDR_ICT/Dev/WSx_Dev/WSx;
}
location /media/ {
    root /EDR_ICT/Dev/WSx_Dev/WSx;
    add_header Content-Type application/octet-stream;
}

“add_header”实际上阻止了nginx在浏览器中打开文本文件!