加入模板
django自带模板,与JAVA的freemarker有异曲同工之处,至于为什么要用模板,我觉得大概有2两个好处吧
一是能使代码整洁.看到一个脚本中有着一堆的HTML代码,甚至还有CSS代码,那恶心成都与代码长度成正比.
二是代码和逻辑分离使码农各自干自己的事情,互不干涉内政,将来要是页面的布局出问题了,那就不管我们逻辑码农的问题了,只要HTML码农改一下就OK了.
django中的模板就是字符串,一坨的HTML代码,加上django的标签,django的关键字标签都用“{% %}”括起来,比如{% if %}和{% endif %}这一对狗男女,还能{% if %}、{% else %}和{% endif %}玩3P.可以在之前的亚克西代码中测试一下,把hello.py修改一下,改成:
from django.template import Context, Template;
def hello(resquest , name):
f = open( ' templates\hello.html ' );
str = f.read();
t = Template(str);
c = Context({ ' name ' : name});
html = t.render(c) ;
return HttpResponse(html);
这里导入了两个新的库
from django.template import Context, Template;
Context是用来填充一个模板的,而Template就是这个模板,str是这个模板的字符串,他从templates\hello.html中获得,hello.html中的文本如下:
这里我们简单的判断了一下name是不是空字符串,如果不是空字符串就表示有名字,需要填充的便用{{ name }}这样的形式,这个name在Context中获得,如果Context中没有定义这个名字,name就是空字符串。在这里,如果不是字符串不是空就输出<p>hello, friend!</p>
一个简单的模板就是这样,可以继续执行下python manage.py runserver测试下,当输入http://localhost:8000/hellovivyli/ 时输出的是hello, vivyli,当输入http://localhost:8000/hello/ 时输出的就是hello, friend!
and,or,not
另外在if 里面还能使用and 、or和not这样的关键字,为了防止我们对于and、or和not的顺序的混乱,据说python不让我们and 和or出现在同一个语句里面,霸气。
另外还有 {%for%},{%endfor%} {%ifequal%},{%ifnotequal%},{%include%}等标签
使用template loader
每次都创建一个Template,并且使用open导入字符串感觉会怪怪的,django提供了一个叫做template loader的东西可以方便使用。
在使用django-adim.py自动生成项目时有个setting.py的文件,需要在这里指定template目录,如
os.path.join(os.path.dirname( __file__ ), ' templates ' )
)
这里指定了当前文件所在文件夹下的templates文件夹作为模板目录。
然后修改hello.py
from django.template import Context;
from django.template.loader import get_template;
def hello(resquest , name):
t = get_template( ' hello.html ' );
c = Context({ ' name ' : name});
html = t.render(c) ;
return HttpResponse(html);
可以看到可以直接使用get_template函数得到模板文件的Template对象。另外django更奇葩的是能把hello函数改成只有一行。
return render_to_response( ' hello.html ' , { ' name ' : name});
在这里要使用render_to_response需要导入django.shutcuts.render_to_response。即添加