模板和表单处理

模板:

模板:模板是一种独立的文本文件,同时包含了静态内容(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>







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值