Explore. Dream. Discover.

Samuel Chen's life

Twenty years from now you will be more disappointed by
the things that you didn't do than by the ones you did do.
So throw off the bowlines. Sail away from the safe harbor.
Catch the trade winds in your sails.

Explore. Dream. Discover.
—— Mark Twain

2011年3月5日星期六

Django 如何在模板(template)中使用settings中预定义的变量


在Django中编写模板(template)的时候,有时候可能会用到settings中设定的变量,比如说STATIC_URL。此时,如果你直接使用 {{ STATIC_URL }} 是取不到值的。那么怎么才能在模板中使用呢?难道非得在每个view中添加到context中吗?

答案是否定的。根据Django文档中所描述,我们至少有两种方法可以直接使用。http://docs.djangoproject.com/en/dev/howto/static-files/#referring-to-static-files-in-templates

方法1:

使用 {% load static %} 载入 static 模块,然后使用 {% get_static_prefix %} 就可以了。
{% load static %}

<img src="{% get_static_prefix %}images/hi.jpg" />
当然也可以将其定义为变量以多次使用
{% load static %}

{% get_static_prefix as STATIC_PREFIX %}

<img src="{{ STATIC_PREFIX }}images/hi.jpg" />
<img src="{{ STATIC_PREFIX }}images/hi2.jpg" />

方法2:

这个方法是推荐的方法,直接使用 RequestContext 来传递。其原因就是因为settings中定义的变量都会在request中传递,但是response的时候是没有这些context的,所以Django专门定义了RequestContext来帮你组合(其实你自己也可以做这件事)。


#注意这里是django.template,由此可见是专门为template设计的
from django.template import RequestContext

def some_view(request):
    # ...
    return render_to_response('my_template.html',
                              my_data_dictionary,
                              context_instance=RequestContext(request))

这个实际作用就是将request中的context全部都加到response的context中去。

这样,你就可以直接在模板中使用{{ STATIC_URL }} 来使用了,当然其他的变量也是可以的,不需要每个都单独去load了。

标签: ,

2011年3月4日星期五

Django 静态文件配置


Django 自带的admin 用户及权限管理是一个很不错的功能,但在开发的时候,如果仅仅只是按照教程中介绍的去掉 urls.py 中相应的注释,那么你很有可能看到的是一个光秃秃的裸体页面,换句话说,就是页面的样式都失效了。

这是怎么回事?其原因就是 Django 不处理静态文件,其静态文件管理需要通过配置,让服务器直接访问。同时,在开发环境中,如果你是用manage.py runserver 的方式运行调试,更是麻烦。在网上找了很久,始终也没有一个很全面的解决方案。

自动动手,丰衣足食,参考 Django 官网的介绍,终于解决了。废话不多说,解决方案如下:

开发环境(manage.py)

参考 http://docs.djangoproject.com/en/dev/howto/static-files/#serving-static-files-in-development.
网上有很多介绍改这个 MEDIA_ROOT, MEDIA_URL 改那个 STATIC_ROOT, STATIC_URL 的,注意,完全没有必要,开发时,这些都不需要改就可以运行。
MEDIA 是指你上传的文件存放,比如图像,视频,压缩包之类的,而STATIC是你网站运行需要依赖的一些静态文件,比如css, js, template 等等。开发时先不管它们。

  • 首先,复制 C:/Python27/Lib/site-packages/django/contrib/admin/media/ 下的文件,到你网站的 c:/mysite/static/ 下,那么就有了 c:/mysite/static/media/ 目录。
  • 其次,将 /static/media/ 改为 /static/admin/ 。 这个修改是为了符合 ADMIN_MEDIA_PREFIX='/static/admin/',你网站上的admin的静态文件都会渲染成 http://server/{{ADMIN_MEDIA_PREFIX}}/xxx/xxx.css 之类,也就成了 http://server/static/admin/xxx/xxx.css ,这样就能找到正确的服务器静态文件了。同时,也是为了避免 media 和 static 造成混淆了,前面说了,MEDIA 实际上是用来存放上传下载文件的。
  • 然后,打开你网站的 c:/mysite/settings.py ,修改 STATICFILES_DIRS 段
    STATICFILES_DIRS = (
        'c:/mysite/static/',
    )
  • 最好,修改 c:/mysite/urls.py,在 urlpatterns 下面增加一行
    urlpatterns += staticfiles_urlpatterns() 
    别忘了头上加上一句
    from django.contrib.staticfiles.urls import staticfiles_urlpatterns
运行python manage.py runserver,用浏览器访问 http://localhost:8000/admin/ , 看看是不是好了。

部署环境

以后试过了再写。


标签: , , ,