模板:
模板:模板是一种独立的文本文件,同时包含了静态内容(HTML)和动态标记的逻辑、循环和数据的显示等。使用那个模板以及渲染什么数据是由视图函数本身(通过显式地渲染后者使用render_to_response)或者视图的参数(比如通用视图里的tempalte_name参数)决定的。
虽然模板系统通常用来生成HTML,但是他并没有和HTML绑定,还可以用来生成log文件,Email正文,CSV等任何文本。
理解contexts:
django传递给渲染模板的信息就称作context,基本上是一个包含键值对的字典。每渲染一个模板都要有一个context.给模板传递context有两个方法:
1、将context作为参数传递给函数reder_to_response .
2、通过context处理器(process),在django 框架中类似与中间件,可以在里面定义各种函数,在模板渲染之前把键值对添加到context上去:
def breadcrumb_processor(request):
return ('breadcrumbs':request.path.split('/'))
context处理器需要在setting.py中激活才能正常使用。
模板语言语法:
django模板语言有两个约定用法,都和大括号相关:
1、变量输出用的是双大括号:{{ }}
2、其他的标签使用 {{% command %}}
几种常用的模板用法:
a、模板过滤器(类似于linux管道)、
b、常用的标签:{% if %} {% ifequal %}
模板继承 {% include %} {% block %} {% extends %}
{% ifequal object_list|length 10 %}
<ul>
{% for item in object_list %}
<li> {{ item }} </li>
</ul>
{% endifequal %}
c、blocks 和 extends
两个标签全部是用来进行模板继承的:区别在于:extends 必须在模板的顶部使用,而block 块可以直接被子模板继承,更改里面的内容;
d、包含其他模板:
{% include %}
表单:
验证和清理:
每一个Form的实例都有一个 is_valid() 方法。用来检查每个属性的值是否合法,如果这个方法被调用的时候,如果每个field都包含的合法的值,它将会做以下两个操作:
返回True 和 将表单的数据放在他的cleaned_data 属性中。下面是一个例子:
from django import forms
class NameForm(forms.Form):
your_name = forms.CharField(label = 'Your name',max_length = 100)
render成html后就会变成:
<label for="your_name"> Your name:</label>
<input id ="your_name" type = "text" name="your_name" max_length = "100">
他不包含一个form tag 也不包含 一个提交的button,我本需要在模板中自己定义。
form 和view 的交互:
form 中用户填写的数据其实还是要返回给pop出form 的那一个view,为了处理form 中的数据,我们需要在view中把他给实例化
from django.shortcuts import render
from django.http import HttpResonseRedirect
def get_name(request):
if request.method =='POST':
form = NameForm(request.POST)
if form.is_valid():
data = form.cleaned_data
print data['name']
print data['email']
return HttpResponseRedirect('/thanks/')
else:
form = NameForm()
return render(request,'name.html',{'form',form})
如果请求是GET类型,view 将回复一个空的form(称作未绑定的form) ,这就是用户第一次点击form 的url 我们返回的效果,如果是POST,我们就进行is_valid的验证操作,以及将POST绑定给form 实例,这个form 此时就称作被绑定的form.
这样我们在模板文件中只需要定义一下代码就可以了:
<form action = "/your-name/" method="post">
{% csrf_token %}
{{ form }}
<input type="submot" value="Submit" />
</form>
{% csrf_token %} 是用来防范csrf攻击;
所有的form 类都是django.forms.Form的子类
Bound的form instance 和 unbound form instance的区别:
未绑定的就是没有任何数据的form,当rendered给用户的时候,form是空的或者包含这默认值;
绑定的就是包含着用户提交的数据,并且可以测试值时候“合法”,如果不合法就会返回错误信息并且告诉用户更正。
form的is_bound(),可以测试是否绑定了数据;
只要一个form被is_valid()方法鉴定为True,传递过来验证过的表单数据就会被复制到form.cleaned_data字典中去。其中的数据都已经被转换成Python的格式。(依旧可以通过request.POST来获取没有转换过的数据)。
下面是一个发送邮件的示例:
from django.core.mail import send_mail
if form.is_vaild():
subject = form.cleaned_data['subject']
message = form.cleaned_data['message']
sender = form.cleaned_data['sender']
cc_self = form.cleaned_data['cc_myself']
recipients = ['info@example.com']
if cc_myself:
recipients.append(sender)
send_mail(subject,message,sender,recipients)
return HttpResponseRedirect('/thanks/')
form 和templates的交互:
这模板中定义的一下标签可以转换成<label>/<input>
{{ form.as_table }}
{{ form.as_p }}
{{ form.as_ul }}
如果使用{{ form.as_p }} 输出ContactForm,html页面将会如下所示:
<p><label for="id_subject">Subject:</label>
<input id="id_subject" type="text" name="subject" maxlength="100" /></p>
<p><label for="id_message">Message:</label>
<input type="text" name="message" id="id_message" /></p>