我正在努力让我的静态文件工作。在开始发布文档链接之前,我已经阅读并阅读了我已完成的django-tutorial级别的最佳理解以下链接:
- 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 }}" />
查看网站检查员,我们看到返回的网址是:
my_app/static/my_app/images/other_<id>/<image_file>
以及 - 如果 - 在检查员中 - 我将该网址更改为
static/my_app/images/other_<id>/<image_file>
图像出现了!
那么如何获得 - 开发 - 正确的网址?
我们的时候:
+ static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
添加到urlpattern
或根目录中的my_app
吗?或两者兼而有之?简而言之,有人可以教我如何为静态图像提供服务吗? 我真的很困惑。
答案 0 :(得分:2)
Django的术语并不完美。两者都是&#34;静态&#34;和&#34;媒体&#34;文件是静态的(在生产中,两者都应该由Web服务器提供,而不涉及Django)。此外,&#34;媒体&#34;文件可以是任何类型的文件,而不仅仅是媒体。一个更好的术语可能是&#34; app文件&#34;和&#34;数据文件&#34;。
&#34; 静态文件&#34;是那些永久的;它们是您申请的一部分。这些通常是JavaScript,CSS和图标,如徽标和图标。
&#34; 媒体文件&#34;是应用数据。在某种程度上,它们是数据库的一部分,但Django更喜欢将它们存储在数据库之外。通常,这些文件对应ImageField
和FileField
。
在开发中,Django会自动提供静态文件。您需要的唯一配置是STATIC_URL = '/static/'
。如果您有文件my_app/static/my_app/js/myjsfile.js
,Django将在http://localhost:8000/static/my_app/js/myjsfile.js投放该文件(网址中的/static/
实际上由STATIC_URL
指定)。在模板中,您通常使用<script src="{% static 'my_app/js/myjsfile.js' %}">
之类的内容,Django会将其转换为<script src="/static/my_app/js/myjsfile.js">
,但即使您决定更改STATIC_URL
,它也能正常运行。除了设置STATIC_URL
并设置DEBUG = True
之外,您通常不需要进行任何配置。
对于媒体文件,您需要同时指定MEDIA_ROOT
和MEDIA_URL
。第一个是&#34; media&#34;文件实际上会被存储,MEDIA_URL
就是媒体网址,例如MEDIA_URL = '/media/'
。这意味着http://localhost:8000/media/xxx会导致媒体文件。您还需要DEBUG = True
。
在制作中,事情变得更复杂。我已经a graphic解释了它。