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_URL
和 MEDIA_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在浏览器中打开文本文件!
我完全受困于此,我有一个带有文件字段的简单模型:
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_URL
和 MEDIA_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在浏览器中打开文本文件!