Django:了解如何在开发过程中提供静态文件 - NOOB版

时间:2017-08-16 10:57:38

标签: python django python-3.x static

我正在努力让我的静态文件工作。在开始发布文档链接之前,我已经阅读并阅读了我已完成的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吗?或两者兼而有之?
  • 媒体和静态有什么区别。图像文件(除非您使用动态svgs)不被视为静态吗?
  • 为什么我必须在全局root static / media文件夹中编译所有东西(不能破坏模块化的目的?)

简而言之,有人可以教我如何为静态图像提供服务吗? 我真的很困惑。

1 个答案:

答案 0 :(得分:2)

Django的术语并不完美。两者都是&#34;静态&#34;和&#34;媒体&#34;文件是静态的(在生产中,两者都应该由Web服务器提供,而不涉及Django)。此外,&#34;媒体&#34;文件可以是任何类型的文件,而不仅仅是媒体。一个更好的术语可能是&#34; app文件&#34;和&#34;数据文件&#34;。

&#34; 静态文件&#34;是那些永久的;它们是您申请的一部分。这些通常是JavaScript,CSS和图标,如徽标和图标。

&#34; 媒体文件&#34;是应用数据。在某种程度上,它们是数据库的一部分,但Django更喜欢将它们存储在数据库之外。通常,这些文件对应ImageFieldFileField

开发中,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_ROOTMEDIA_URL。第一个是&#34; media&#34;文件实际上会被存储,MEDIA_URL就是媒体网址,例如MEDIA_URL = '/media/'。这意味着http://localhost:8000/media/xxx会导致媒体文件。您还需要DEBUG = True

制作中,事情变得更复杂。我已经a graphic解释了它。