django学习笔记.views.py

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,340评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,762评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,329评论 0 329
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,678评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,583评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,995评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,493评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,145评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,293评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,250评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,267评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,973评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,556评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,648评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,873评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,257评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,809评论 2 339

推荐阅读更多精彩内容