模板语言
依赖于 Python, 可以把数据内嵌到 html 中展示.
eg:
<span style="color: #0000ff"><!</span><span style="color: #ff00ff">DOCTYPE html</span><span style="color: #0000ff">></span> <span style="color: #0000ff"><</span><span style="color: #800000">html</span><span style="color: #0000ff">></span> <span style="color: #0000ff"><</span><span style="color: #800000">head </span><span style="color: #ff0000">lang</span><span style="color: #0000ff">="en"</span><span style="color: #0000ff">></span> <span style="color: #0000ff"><</span><span style="color: #800000">meta </span><span style="color: #ff0000">charset</span><span style="color: #0000ff">="UTF-8"</span><span style="color: #0000ff">></span> <span style="color: #0000ff"><</span><span style="color: #800000">title</span><span style="color: #0000ff">></span>你好<span style="color: #0000ff"></</span><span style="color: #800000">title</span><span style="color: #0000ff">></span> <span style="color: #0000ff"></</span><span style="color: #800000">head</span><span style="color: #0000ff">></span> <span style="color: #0000ff"><</span><span style="color: #800000">body</span><span style="color: #0000ff">></span> <span style="color: #0000ff"><</span><span style="color: #800000">div</span><span style="color: #0000ff">></span> <span style="color: #0000ff"><</span><span style="color: #800000">table </span><span style="color: #ff0000">border</span><span style="color: #0000ff">="1px"</span><span style="color: #0000ff">></span><span style="color: #000000"> {% for item in data %} </span><span style="color: #0000ff"><</span><span style="color: #800000">tr</span><span style="color: #0000ff">></span> <span style="color: #0000ff"><</span><span style="color: #800000">td</span><span style="color: #0000ff">></span>{{item.id}}<span style="color: #0000ff"></</span><span style="color: #800000">td</span><span style="color: #0000ff">></span> <span style="color: #0000ff"><</span><span style="color: #800000">td</span><span style="color: #0000ff">></span>{{item.hostName}}<span style="color: #0000ff"></</span><span style="color: #800000">td</span><span style="color: #0000ff">></span> <span style="color: #0000ff"></</span><span style="color: #800000">tr</span><span style="color: #0000ff">></span><span style="color: #000000"> {% endfor %} </span><span style="color: #0000ff"></</span><span style="color: #800000">table</span><span style="color: #0000ff">></span> <span style="color: #0000ff"></</span><span style="color: #800000">div</span><span style="color: #0000ff">></span> <span style="color: #0000ff"></</span><span style="color: #800000">body</span><span style="color: #0000ff">></span> <span style="color: #0000ff"></</span><span style="color: #800000">html</span><span style="color: #0000ff">></span> <span style="color: #008000">#</span><span style="color: #008000"> settings.py</span> TEMPLATE_DIRS =<span style="color: #000000"> ( os.path.join(BASE_DIR, </span><span style="color: #800000">'</span><span style="color: #800000">web/template</span><span style="color: #800000">'</span><span style="color: #000000">), ) TEMPLATES </span>=<span style="color: #000000"> [ { </span><span style="color: #800000">'</span><span style="color: #800000">BACKEND</span><span style="color: #800000">'</span>: <span style="color: #800000">'</span><span style="color: #800000">django.template.backends.django.DjangoTemplates</span><span style="color: #800000">'</span><span style="color: #000000">, </span><span style="color: #800000">'</span><span style="color: #800000">DIRS</span><span style="color: #800000">'</span>: TEMPLATE_DIRS, <span style="color: #008000">#</span><span style="color: #008000"> 这里本身是[ ], 需要改成 TEMPLATE_DIRS</span> <span style="color: #800000">'</span><span style="color: #800000">APP_DIRS</span><span style="color: #800000">'</span><span style="color: #000000">: True, </span><span style="color: #800000">'</span><span style="color: #800000">OPTIONS</span><span style="color: #800000">'</span><span style="color: #000000">: { </span><span style="color: #800000">'</span><span style="color: #800000">context_processors</span><span style="color: #800000">'</span><span style="color: #000000">: [ </span><span style="color: #800000">'</span><span style="color: #800000">django.template.context_processors.debug</span><span style="color: #800000">'</span><span style="color: #000000">, </span><span style="color: #800000">'</span><span style="color: #800000">django.template.context_processors.request</span><span style="color: #800000">'</span><span style="color: #000000">, </span><span style="color: #800000">'</span><span style="color: #800000">django.contrib.auth.context_processors.auth</span><span style="color: #800000">'</span><span style="color: #000000">, </span><span style="color: #800000">'</span><span style="color: #800000">django.contrib.messages.context_processors.messages</span><span style="color: #800000">'</span><span style="color: #000000">, ], }, }, ]</span> <span style="color: #008000">#</span><span style="color: #008000"> views.py in web</span> <span style="color: #0000ff">def</span><span style="color: #000000"> All(request): itemList </span>=<span style="color: #000000"> Asset.objects.all() result </span>= render_to_response(<span style="color: #800000">'</span><span style="color: #800000">index.html</span><span style="color: #800000">'</span>, {<span style="color: #800000">'</span><span style="color: #800000">data</span><span style="color: #800000">'</span><span style="color: #000000">:itemList}) </span><span style="color: #0000ff">return</span> result
if html 模板
<span style="color: #000000">{% if xx %} true {% else %} 假 {% endif %}</span>
需要注意, 没有 elseif 这种语法, 如果想要实现, 就需要在 else 里再使用 if 模板.
<span style="color: #000000">{% ifequal xx 'yy' %} true 如果 xx == yy {% else %} 假 {% endif %}</span>
模板还有一些帮助方法, 可以快速实现某些功能, 如首字母大写等.
帮助方法: {{ xxx|date:”Y-m-d H:i:s”}} {{ xxx|truncatewords:”30” }} {{ xxx|first|upper }} {{ xxx|lower }} 具体可自行搜索, 另外还可以通过 simple_tag 来自定义帮助方法:
-
在 app 中创建 templatetags 包
-
创建任意 .py 文件,如:xx.py
#!/usr/bin/env python
coding:utf-8
from django import template from django.template.base import resolve_variable, Node, TemplateSyntaxError
register = template.Library()
@register.simple_tag def my_simple_time(v1,v2,v3): return v1 + v2 + v3
-
在使用自定义 simple_tag 的 html 文件中导入之前创建的 xx.py 文件名(不用带后缀)
{% load xxx %}
-
使用simple_tag
{% my_simple_time 1 2 3%}
-
在 settings中配置当前 app, 不然 Django 无法找到自定义的 simple_tag
INSTALLED_APPS = ( ‘django.contrib.admin‘, ‘django.contrib.auth‘, ‘django.contrib.contenttypes‘, ‘django.contrib.sessions‘, ‘django.contrib.messages‘, ‘django.contrib.staticfiles‘, ‘web‘, )
Form 验证
Form 测试时, 会遇到一个 CSRF (伪造夸张请求) 的错误, 把 settings.py 里 MIDDLEWARE_CLASSES 中的 ‘django.middleware.csrf.CsrfViewMiddleware’ 注释掉就可以了.
Form 验证可以使用 HTML 自带的 input 来发送数据, 也可以使用 Python 的 form(推荐).
使用 HTML 的 form
在 template 目录下建立一个 login.html 文件:
<span style="color: #008000"><!--</span><span style="color: #008000"> HTML </span><span style="color: #008000">--></span> <span style="color: #0000ff"><!</span><span style="color: #ff00ff">DOCTYPE html</span><span style="color: #0000ff">></span> <span style="color: #0000ff"><</span><span style="color: #800000">html</span><span style="color: #0000ff">></span> <span style="color: #0000ff"><</span><span style="color: #800000">head </span><span style="color: #ff0000">lang</span><span style="color: #0000ff">="en"</span><span style="color: #0000ff">></span> <span style="color: #0000ff"><</span><span style="color: #800000">meta </span><span style="color: #ff0000">charset</span><span style="color: #0000ff">="UTF-8"</span><span style="color: #0000ff">></span> <span style="color: #0000ff"><</span><span style="color: #800000">title</span><span style="color: #0000ff">></</span><span style="color: #800000">title</span><span style="color: #0000ff">></span> <span style="color: #0000ff"></</span><span style="color: #800000">head</span><span style="color: #0000ff">></span> <span style="color: #0000ff"><</span><span style="color: #800000">body</span><span style="color: #0000ff">></span> <span style="color: #0000ff"><</span><span style="color: #800000">form </span><span style="color: #ff0000">action</span><span style="color: #0000ff">=""</span><span style="color: #ff0000"> method</span><span style="color: #0000ff">="post"</span><span style="color: #0000ff">></span> <span style="color: #008000"><!--</span><span style="color: #008000"> action 不写, 就是 Post 当前网址 </span><span style="color: #008000">--></span> <span style="color: #0000ff"><</span><span style="color: #800000">p</span><span style="color: #0000ff">></span>First name: <span style="color: #0000ff"><</span><span style="color: #800000">input </span><span style="color: #ff0000">type</span><span style="color: #0000ff">="text"</span><span style="color: #ff0000"> name</span><span style="color: #0000ff">="fname"</span> <span style="color: #0000ff">/></</span><span style="color: #800000">p</span><span style="color: #0000ff">></span> <span style="color: #0000ff"><</span><span style="color: #800000">p</span><span style="color: #0000ff">></span>Last name: <span style="color: #0000ff"><</span><span style="color: #800000">input </span><span style="color: #ff0000">type</span><span style="color: #0000ff">="text"</span><span style="color: #ff0000"> name</span><span style="color: #0000ff">="lname"</span> <span style="color: #0000ff">/></</span><span style="color: #800000">p</span><span style="color: #0000ff">></span> <span style="color: #0000ff"><</span><span style="color: #800000">input </span><span style="color: #ff0000">type</span><span style="color: #0000ff">="submit"</span><span style="color: #ff0000"> value</span><span style="color: #0000ff">="Submit"</span> <span style="color: #0000ff">/></span> <span style="color: #0000ff"><</span><span style="color: #800000">span</span><span style="color: #0000ff">></span>{{status}}<span style="color: #0000ff"></</span><span style="color: #800000">span</span><span style="color: #0000ff">></span> <span style="color: #0000ff"></</span><span style="color: #800000">form</span><span style="color: #0000ff">></span> <span style="color: #0000ff"></</span><span style="color: #800000">body</span><span style="color: #0000ff">></span>
修改 views.py:
<span style="color: #008000">#</span><span style="color: #008000"> python</span> <span style="color: #0000ff">def</span><span style="color: #000000"> Login(request): </span><span style="color: #008000">#</span><span style="color: #008000">print request.method</span> <span style="color: #0000ff">if</span> request.method == <span style="color: #800000">'</span><span style="color: #800000">POST</span><span style="color: #800000">'</span><span style="color: #000000">: fname </span>= request.POST.get(<span style="color: #800000">'</span><span style="color: #800000">fname</span><span style="color: #800000">'</span>, None) <span style="color: #008000">#</span><span style="color: #008000"> 第二个参数是默认返回值</span> lname = request.POST.get(<span style="color: #800000">'</span><span style="color: #800000">lname</span><span style="color: #800000">'</span><span style="color: #000000">, None) result </span>= UserInfo.objects.filter(username=fname, password=<span style="color: #000000">lname).count() </span><span style="color: #0000ff">if</span> result == 1<span style="color: #000000">: </span><span style="color: #0000ff">return</span> HttpResponse(<span style="color: #800000">'</span><span style="color: #800000">登录成功</span><span style="color: #800000">'</span><span style="color: #000000">) </span><span style="color: #0000ff">else</span><span style="color: #000000">: </span><span style="color: #0000ff">return</span> render_to_response(<span style="color: #800000">'</span><span style="color: #800000">login.html</span><span style="color: #800000">'</span>, {<span style="color: #800000">'</span><span style="color: #800000">status</span><span style="color: #800000">'</span>:<span style="color: #800000">'</span><span style="color: #800000">用户名或密码错误</span><span style="color: #800000">'</span><span style="color: #000000">}) </span><span style="color: #0000ff">return</span> render_to_response(<span style="color: #800000">'</span><span style="color: #800000">login.html</span><span style="color: #800000">'</span>)
之所以用 filter 而不用 get, 是因为 get 方法如果结果为空时会报异常.
最后在 urls.py 里做映射, 然后通过 localhost:8000/web/login/ 就能进入 Login 函数, 然后返回 login.html 开始登录操作.
urlpatterns =<span style="color: #000000"> [ url(r</span><span style="color: #800000">'</span><span style="color: #800000">^login/</span><span style="color: #800000">'</span><span style="color: #000000">, Login), ]</span>
使用 Python 的 form
-
在 web 下新建一个 forms.py 文件
#-- coding:utf-8 --
from django import forms
######################################################################## class RegisterForm(forms.Form): “”“ 注册用 Form “”“
userName </span>=<span style="color: #000000"> forms.CharField() email </span>= forms.EmailField(required=True)
-
在 template 目录中 regist.html
<!DOCTYPE html> <html> <head lang=”en”> <meta charset=”UTF-8”> <title>title> head> <body> <form action=”“ method=”post”> <p>账号: {{form.userName}}p> <p>邮箱: {{form.email}}p> <input type=”submit” value=”Submit” /> <span>{{status}}span> form> body> html>
可以看到, 省略了 input 标签, 而改用 {{form.xxx}}.
-
在 views.py 中添加函数
from forms import RegisterForm
def Regist(request): #print request.method if request.method == ‘POST‘: regist = RegisterForm(request.POST) if regist.is_valid(): # 如果格式满足要求, 例如 邮箱必须是有 @ 的 data = regist.cleaned_data # 获取数据 result = ‘注册成功, 账号:%s 邮箱:%s‘ % (data[‘userName‘], data[‘email‘]) return HttpResponse(result) else: # 验证失败 return HttpResponse(regist.errors.as_json()) else: regist = RegisterForm() return render_to_response(‘regist.html‘, {‘form‘:regist})
-
最后在 urls.py 中映射下即可.