【发布时间】:2017-08-16 10:57:38
【问题描述】:
我正在努力让我的静态文件正常工作。在开始发布文档链接之前,我已经阅读并尽我所能了解以下链接:
- https://docs.djangoproject.com/en/1.11/ref/models/fields/#django.db.models.FileField
我会说我认为其中的第二个非常令人困惑。
简而言之,我使用文档解决问题的尝试均未成功。所以我会很感激有人带我了解正在发生的事情。
首先,我有一个应用程序,my_app。在my_app 我有一个模型,它的图像字段如下所示:
def my_app_dir_path(instance, filename):
return 'my_app/static/my_app/images/other_{0}/{1}'.format(instance.other.id, filename)
MyModel(models.Model):
other = models.ForeginKey("other", on_delete=models.CASCADE)
image = models.ImageField(upload_to=my_app_dir_path)
简而言之,我上传的文件会转到命名空间的本地静态目录:
/my_app/static/my_app/images/other_<id>/<image_file>
正如它所说,我应该在 (4) 中为链接如何配置静态文件配置静态文件。
太好了。
我有一个虚拟视图,我正在使用它来尝试查看是否可以加载我的图像:
#/my_app/views.py
def dummy(request):
img = MyModel.objects.first()
return render(request, 'my_app/dummy.html', {'img':img})
基本上就是这样
#dummy.html
<img src="{{ img.image.url }}" />
查看网站检查器,我们看到返回的 url 是:
my_app/static/my_app/images/other_<id>/<image_file>
如果 - 在检查器中 - 我将该 url 更改为
static/my_app/images/other_<id>/<image_file>
图像出现!
那么我如何获得 - 用于开发 - 正确的 url?
当我们在做的时候:
- 这个约定是什么? ('/var/www/static/')
- 我应该将
+ static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)添加到我的urlpattern中的my_app还是根目录中?还是两者兼有? - 媒体和静态之间有什么区别。图像文件(除非您使用动态 svg)不被视为静态文件吗?
- 为什么我必须在全局根静态/媒体文件夹中编译所有内容(这难道不符合模块化的意义吗?)
简而言之,有人可以教我如何为开发提供静态图像吗? 我真的很困惑。
【问题讨论】:
-
您将 MEDIA 文件(由用户在应用程序运行时上传,未检入版本控制)与静态文件(与应用程序一起部署,通常检入版本控制)混淆了。您没有显示任何设置(例如
MEDIA_URL、MEDIA_ROOT),这使得提供帮助变得更加困难。你的标题说的是部署,但你的问题是开发,所以不清楚你在哪里遇到了麻烦。看起来 this section 就是您要查找的内容。 -
@Alasdair 是的,对不起,我的意思是标题中的发展(现已更正)。然而,媒体的东西是当你开始一个新项目的时候。没摸过。我不知道它是什么或它做什么或为什么它与静态不同。我已经看过那部分,并尝试了该解决方案,但它确实有效
-
如果你没有设置
MEDIA_URL(例如MEDIA_ROOT = '/media/')或MEDIA_ROOT(例如MEDIA_ROOT = '/path/to/where/you/want/to/store/uploaded/files/'),它将无法工作。 -
@Alasdair 媒体 url 和媒体根有什么区别,当我的图片是静态的并由管理员上传时,为什么我必须设置它们
-
正如我之前所说,Django 将用户上传的文件(无论他们是否使用管理员)视为媒体文件,而不是静态文件。文档解释了
MEDIA_ROOT和MEDIA_URL的用途。
标签: python django python-3.x static