views.py定义存取数据程序的逻辑,是一个视图模块
from django.shortcuts import render
当网站有数据需要输出的时候,通过渲染函数render网页显示,把数据存放当模板的指定位置
from django.http import HttpResponse
将变量输出到用户端的浏览器上
from models import Post
引入数据模块
from django.template.loader import get_template
定义视图函数
def homepage(request):
template = get_template("index.html")
寻找和获取html模板
posts = POST.objects.all()
获取全部数据
html = template.render(locals())
return HttpResponse(html)
locals()会把当前内存中的所有局部变量使用字典类型打包起来,render()函数接受一个字典,render({'post':post})
from django.shortcuts import redirect
可以重定向至指定页面
使用HttpResponseRedirect##
from django.http import HttpResponse,HttpResponseRedirect
return HttpResponseRedirect('/list/')
from django.http import Http404
return Http404("找不到指定的页面")
获取数据的方式
- 获取全部数据
posts = POST.objects.all()
- 获取指定数据
当设置urls.py网址映射时可以获取网址中指定的字符串,传给视图函数模板,然后在视图函数模板中引入,举例:
urls.py:
url(r'post/(\w+)$',showpost),
views.py:
def showpost(request,slug):
post = POST.objects.get(slug )
- 创建一组数据
p = Post.objects.create(title = '',slug = '',body = '')
p.save()
数据的查询和编辑
p = Product.objects.filter(qty_lt = 2)
以上是获取Product.qty小于2的所有数据
此外,gt/gte/lt/lte分别代表 大于/大于等于/小于/小于等于
其他常用的例子:
p = Product.objects.all().order_by("-price")[:30]
Product.objects.filter(qty = 0).first()
Product.objects.exclude(qty = 0).last()
from django.db.models import Count,Sum
Product.objects.filter(price_lt = 500).aggregate(Count('qty'))
Product.objects.filter(price_lt = 500).aggregate(Sum'qty'))
统计价格低于500的产品数
Product.objects.filter(name_icontains = 'sony')
找出name包含'sony'的所有产品
Product.objects.filter(qty_in = [1,2])
当页面的form的传送方式为GET时,在views.py中我们就可以使用request.GET['user_id']来获取传送过来的内容
如果页面要提供下拉式菜单功能时,我们可以先在views.py的对一个视图函数中定义一个列表变量,然后通过template.render(locals())传至页面,在html中通过for循环显示出来
比如我们要提供一个年份的下拉菜单
可以先在views.index中定义:
years = range(1990,2017)
然后再index.html中:
<label for="byear">出生年份</label>
<select name="byear">
{% for year in years %}
<option value="{{ year }}">{{ year }}</option>
{% endfor %}
</select>
当form里有复选框checkbox时,想要获取列表数据,我们可以通过:
colorllist = request.GET.getlist('fcolor')来获取选中的项目
request.POST
当页面的form,method为POST时,为防止CSRF,我们应该在html页面中的<form>标签下添加标识符:
{% csrf_token %}
同时视图函数中的参数变量也要更改处理方式
原来:
html = template.render(locals())
更改为:
request_context = RequestContext(request)
request_context.push(locals())
html = template.render(request)
当然要引入模块:
from django.template import RequestContext
在views.py中设置好form以后可以直接在views.py中引入,传入html为页面所用:
from mysite import forms
form = forms.ContactForm()
在html页面中插入:
{{ form.as_p }}
会以<p>段落格式的方式产生窗体的字段内容,但是并不会产生<form></form>和提交按钮,所以在html编写时要格外添加:
.html
<form action = "." method = "POST">
{% csrf_token %}
{{ form.as_p }}
<input type = "submit" value = "提交">
</form>
此外还可以以表格和列表的形式引入表单
{{ form.as_tabel }} {{ form.as_ul }}
对表单的数据接收和处理
在views.py中我们应先判断传进来的内容是否为POST,如果是,那么request就是单击了form中的submit提交上来的,之后进行数据处理。如果不是,就建立一个实例,维持显示窗体的形式:
def contact(request):
if request.method == 'POST':
from = forms.ContactForm(request.POST)
pass ## 数据处理
else:
form = forms.ContactForm()
接收成果后进行数据提取:
首先要检查窗体的正确后,然后提取
form = forms.ContactForm(request.POST)
if form.is_valid():
user_name = form.cleaned_data['user_name']
user_city = form.cleaned_data['user_city']
在django中使用mailgun
from django.core.mail import EmailMessage
def contact(request):
mail_body = u''
email = EmailMessage('来自谁的意见',mail_body,user_email,[75874239@qq.com])
email.send()
使用ModelForm来产生表单
post_form = forms.PostForm()
在html页面引入form的方式和之前一样
数据的接收和保存更为简单
在视图函数中:
if request.method == "POST":
post_form = forms.PostForm(request.POST)
if post_form.is_vaild():
post_form.save()
else:
post_form = forms.PostForm()
使用session
cookie
通过客户端的浏览器在客户端某些被限定的硬盘位置中写入某些数据
设置cookie必须在执行完HttpResponse之后,在要处理函数直接以HttpResponse(html)把网页内容回传给网页服务器之后,先以一个变量记录此实例,然后以response.set_cookie(key,value)的方式把cookie放在response中,然后return response
response.set_cookie('username', username)
return response
要获取cookie:
username = request.COOKIES['username']
删除cookie:
response.delete_cookie('username')
return response
使用session
把所有的数据放在服务器上。
将变量数据存到session中:
request.session['username'] = '用户名称'
从session中取出:
username = request.session['username']
这些数据存在的事件可以通过set_expiry(value)函数来设置
使用django内建的auth用户验证
from django.contrib.auth import User
创建一个新用户
user = User.objects.create_user()
django.contrib.auth提供了三个主要函数,分别是authenticate验证,login,logout
在views.py的视图函数中获取表单数据后,例如:
login_name =request.POST['username'].strip()
login_password = request.POST['password']
user = authenticate(username = login_name,password = login_passwrod)
auth.login(request,user)#把此用户的数据存入Session中,供接下来的其他网页使用。
之后就可以在其他视图函数中使用is_authenticated来检查用户是否登录了:
if request.user.is_authenticated():
username = request.user.username
其他视图函数也可以使用装饰器@login_required来验证是否登录,告诉django接下来的处理函数内容是需要登录过才能浏览的
###在视图函数前添加:
@login_required(login_url = '/login/')
### 注销
auth.logout(request)
# 网站的用户注册和管理
采用一个框架django-registration,电子邮件注册启用模板
pip install django-registration
然后在setting中设置一个常数:
ACCOUNT_ACTIVATION_DAYS = 7
在urls.py中添加网址:
url(r'^account/',include('registration.backends.bmac.urls')),
header.html的注册链接更改为'/accounts/register'
在templates目录下新建registration文件夹,放入所需的模板:
registration_form.html
registration_complete.html
activation_complete.html
activate.html
activation_email.txt
activation_email_subject.txt
网友评论