Django框架学习之视图函数(三)

from django.shortcuts import render

def func(request):

return render(request, 'XXX.html', [kwargs])
return redirect('XXX.html')
return HttpResponse('str')

http请求中产生两个核心对象:
HttpRequest对象(http请求)
HttpResponse对象(http响应)
视图函数中第一个参数request就是HttpRequest

1 视图函数返回方法 render() 和 redirect()
render(request, template_name, context=None)
request:浏览器发送过来的请求对象HttpRequest,包含用户信息、请求内容和请求方式等
template_name:templates目录下的html文件名,返回给浏览器的文件
context:对返回的html文件内特殊变量({{ obj }}视图函数和html文件中都存在obj变量)进行赋值处理,以字典形式表示,
locals()表示将函数内所有赋值变量(视图函数和html文件中都存在的变量)传给html文件
redirect('/XXX.html')
用于实现请求重定向

2 request对象
属性:
method: 请求中使用的HTTP方法的字符串表示。全大写表示。
GET: 包含所有HTTP GET参数的类字典对象
POST: 包含所有HTTP POST参数的类字典对象
服务器收到空的POST请求的情况也是可能发生的,也就是说,表单form通过
HTTP POST方法提交请求,但是表单中可能没有数据,因此不能使用
if req.POST来判断是否使用了HTTP POST 方法;应该使用 if req.method=="POST"
FILES: 包含所有上传文件的类字典对象;FILES中的每一个Key都是<input type="file" name="" />标签中
name属性的值,FILES中的每一个value同时也是一个标准的python字典对象,包含下面三个Keys:
filename: 上传文件名,用字符串表示
content_type: 上传文件的Content Type
content: 上传文件的原始内容
user: 是一个django.contrib.auth.models.User对象,代表当前登陆的用户。如果访问用户当前
没有登陆,user将被初始化为django.contrib.auth.models.AnonymousUser的实例。你
可以通过user的is_authenticated()方法来辨别用户是否登陆:
if req.user.is_authenticated();只有激活Django中的AuthenticationMiddleware
时该属性才可用
COOKIES: 包含所有cookies的标准Python字典对象;keys和values都是字符串。
session: 唯一可读写的属性,代表当前会话的字典对象;自己有激活Django中的session支持时该属性才可用。
path: 请求页面的全路径,不包括域名

方法
get_full_path(),
比如:http://127.0.0.1:8000/index33/?name=123 ,
req.get_full_path() 得到的结果就是/index33/?name=123
req.path:/index33
注意:
POST = {...,'a': [1, 2, 3]}
request.POST.get('a') –>3 只能获取数组中的最后一个
request.POST.getlist('a') –>[1,2,3]可以获取到数组

3 通用视图
TemplateView
直接返回html文件,不操作数据库
ListView
操作数据库,并将数据传给html文件,通常获取某个表的全部数据
DetailView
操作数据库,并将数据传给html文件,通常获取某个表的单条数据

# urls.py
from django.urls import path
from . import views

urlpatterns = [
path('my_view/', views.my_view),
path('temp_view', views.MyTemplateList.as_view()),
path('list_view/<int:id>', views.MyListView.as_view(), {'name': 'dsy'}),
]
#views.py
from django.views.generic import TemplateView, ListView
from ADMIN import models
from django.shortcuts import render

class MyTemplateList(TemplateView):
# 指定返回的html文件
template_name = 'temp_view.html'

def get_context_data(self, **kwargs):
context = super(MyTemplateList, self).get_context_data(**kwargs)
# 操作数据库并将变量传给模板
context['list1'] = models.Student.objects.all()
return context


class MyListView(ListView):
# 设定html文件
template_name = 'list_view.html'
# 设置html文件变量名称
context_object_name = 'stu_obj'
# 操作数据库, 默认取出该表所有数据。想要过滤自定义只能在get_queryset()中
queryset = models.Student.objects.all()

def get_queryset(self):
# 获取URL的参数字典
print(self.kwargs)
# 获取URL的变量id
print(self.kwargs['id'])
# 获取URL的参数name
print(self.kwargs['name'])
# 获取请求方式
print(self.request.method)
stu_obj = models.Student.objects.all()[:3]
return stu_obj

def get_context_data(self, *, object_list=None, **kwargs):
context = super(MyListView, self).get_context_data(**kwargs)
# 操作数据库并将变量传给模板
context['grade_name'] = models.Grade.objects.values('name').distinct()
return context

def my_view(request):
L = models.Student.objects.all().values_list('name', 'stu_id')
return render(request, 'my_view.html', locals())

posted on 2018-12-09 13:46  为你一千万遍  阅读(362)  评论(0编辑  收藏  举报