Django 4 视图

6 篇文章 0 订阅
6 篇文章 0 订阅

视图 (View) 是 Django 的 MTV 架构模式的 V 部分, 主要负责 处理用户请求和生成相应的响应内容, 然后在页面或其他类型文档中显示。 也可以理解为视图是 MVC 架构里面的 C 部分 〈控制器) , 主要处理功能和业务上的逻辑。

使用模板实现下载功能:

在 index 的 urls.py 和 views-py 中分别添加以下代码:
 

# 在urls.py中
path(r'download.html', views.download)
# 在views.py中
def download(request):
    response = HttpResponse(content_type='text/csv')
    response['Content-Disposition'] = 'attachment; filename = "somefilename.csv"'
    writer = csv.writer(response)
    writer.writerow(['First row', 'A', 'B', 'C'])
    return response
  • 当接收到用户的请求后,视图函数 download 首先定义 HtφResponse 的响应类 型为文件 (text/csv) 类型,生成 response 对象。
  • 然后在 response 对象上定义 Content-Disposition,设置浏览器下载文件的名称。 a忧achment 设置文件的下载方式,自lename 为文件名 。
  • 最后使用 CSV 模块加载 response 对 象,把数据写入 response 对象所设置的csv 文件并将 response 对象返回到浏览器上,从而实现文件下载。

django.http 除了实现文件下载之外, 要使用该模块生成精美的 HTML 网页,可以 在响应内容中编写 HTML 源码,如 HttpResponse(, <html><body>... </b0 dy></html>。尽管这是一种可行的方法,但并不符合实际开发。因此, Djang。 在 司jango.htφ 模块上 进行封装,从而有了 render()、 render_to_response() 和 redirect() 函数。

render() 和 render_to_response() 实现的功能是一致的。 render_ to _response() 自 2.0 版本以来已开始被弃用,并不代表在 2.0 版本无法使用,只是大部分开发者都使用 render()。

render 语法:

render (request, template_name, context = None, content_type = None, status = None, using = None) 
  • request: 浏览器向服务器发送的请求对象,包含用户信息、请求内容和请求方式等。
  • template_name: HTML 模板文件名,用于生成 HTML 网页 。
  • context: 对 Html 模板的变量赋值,以字典格式表示, 默认情况下是一个空字典。
  • content_type: 响应数据的数据格式,一般情况下使用默认值即可。
  • status: HTTP 状态码,默认为 200。
  •  using: 设置 Html 模板转换生成 Html 网页的模板引擎。

除了 render 函数外,还有 redirect() 函数。 redirect() 函数用于实现请求重定向, 重定向的链接以字符串的形式表示,链接的地址信息可以支持相对路径和绝对路径。

# urls.py 的 URL 地址信息 
path('login.html',views.login) 

# views.py 的视图函数 
def login(request) : 
    #相对路径, 代表首页地址 
    return redirect('/') 
    #绝对路径, 完整的地址信息 
    # return redirect('http://127.0.0.1:8000/') 

数据可视化(将数据库中的数据显示到模板中)

视图除了接收用户请求和返回响应内容之外, 还可以与模型 (Model) 实现数据 交互(操作数据库)。视图相当于一个处理中心,负责接收用户请求, 然后根据请求 信息读取并处理后台数据,最后生成 HTML 网页返回给用户 。

视图操作数据库实质是从 models.py 导入数据库映射对象, models.py 的数据库对 象是通过 Django 内置的 ORM 框架构建数据库映射的,从而生成数据库对象。

使用数据模型生成迁移文件并且创建数据库中的表。

生成迁移文件:

#根据 models .py 生成相关的 .py 文件,该文件用于创建数据表 
E : \MyDjango>python manage.py makemigrations 
Migrations for 'index': 
    index \migrations\OOOl_initial. py 
        - Create model product 

执行迁移文件:

E : \MyDjango>python manage .py migrate 

在模板中添加下面代码, 主要将视图 的变量传递给模板,通过模板 引擎转换成 HTML 语言。

    <ul id="cate_box" class="lf">
        {% for type in type_list %}
        <li>
            <h3><a href="#">{{ type.type }}</a></h3>
            <p>
                {% for name in name_list %}
                    {% if name.type == type.type %}
                        <span>{{ name.name }}</span>
                    {% endif %}
                {% endfor %}
            </p>
        </li>
        {% endfor %}
    </ul>

在视图中增加下面代码从数据库中抽取数据返回到模板中:

def index(request):
    type_list = Product.objects.values('type').distinct()
    name_list = Product.objects.values('name','type')
    context = {'title': '首页', 'type_list': type_list, 'name_list': name_list}
    return render(request, 'index.html',context=context, status=200)

对上述代码的解释:

  1. type_list 用于查询数据表字段 type 的数据并将数据去重, name list 用于查询数 据表字段 type 和 name 的全部数据, 这两种独特的查询方式都是由 Django 内置的 ORM 框架提供的。
  2. 将查询所得的数据以字典的数据格式写入变量 context 中 , 变量 context 是rende() 函数的参数值,其作用是将变量传递给 HTML 模板。
  3. 当 HTML 模板接收到变量 type_list 和 name list 后,模板引擎解析模板语法并生成 HTML 文件。

想要将数据库的数据展现在网页上, 需要由视图 、模型和模板共同实现, 实现步骤如下:

  1. 定义数据模型, 以类的方式定义数据表的字段。 在数据库创建数据表时, 数据表由模型定义的类生成。
  2. 在视图导入模型所定义的类, 该类也称为数据表对象, Django 为数据表对象提供独有的数据操作方法, 可以实现数据库操作, 从而获取数据表的数据。
  3. 视图函数获取数据后, 将数据以字典、列表或对象的方式传递给 HTML 模板, 并 由模板引擎接收和解析, 最后生成相应的 HTML 网页。

在上述视图函数中,交量 context 是以 字典的 形式传递给 HTML 模板的 。 在实际开发过程中,如果传递的交量过多,使用变量 context 时就显得非常冗余,而且不利于日后的维护和更新。 因此,使用 locals() 取代变量 context。

locals() 的使用方法:在视图函数中所定义的变量名一定要与 HTML 模板的变量名相同才能生效,如视 图 函数的 type_list 与 HTML 模板的 type_list,两者的交量名 一致才能将视图函数的 变 量传递给 HTML 模板。
 

获取请求信息:

请求信息属性说明实例
cookies客户端浏览器的Cookie信息data = request.COOKIES
FILES字典对象,包含所有的上传文件。该字典有三个键:filename 为上传文件的文件名;content-type 为上传文件的类型;content 为上传文件的原始内容。file = request.FILES
GET获取GET请求的请求参数,以字典形式存储// {'name': 'TOM'} request.GET.get('name') 
META获取客户端的请求头信息,以字典形式存储

// 获取客户端的IP地址

request.META.get('REMOTE_ADDR')

POST获取POST请求的请求参数,以字典形式存储

// 如 {'name': 'TOM'}

request.POST.get('name')

method获取当前请求的请求方式(GET或POST)data = request。method
path获取当前请求的URL地址path = request.path
user获取当前请求的用户信息

// 获取用户名

name = request.user.username

一般情况下,用户打开浏览器 访问某个 URL 地址都是 GET 请求:而在网页上输入信息并点击某个按钮时, 以 POST 请求居多,如用户登录、注册等。


GET:

在浏览器上分别输入以下 URL 地址:

http://127.0.0.1:8000/1ogin.html?name=Torn 

通用视图:

 Django 植入了通用视图这一功能,该功能封装了视图开发常用 的代码和模式,可以在无须编写大量代码的情况下,快速完成数据视图的开发。

  • TemplateView:TemplateView 直接返回 HTML 模板,但无法将数据库的数据展示出来。
  •  ListView :ListView 能将数据库的数据传递给 HTML 模板,通常获取某个表的所有数据。
  • DetailView :DetailView 能将数据库的数据传递给 HTML 模板,通常获取数据表的单条数据。

在 urls.py 中添加 URL 地址信息,代码如下:

# views.py 代码 
from django.urls import path 
from . import views 
urlpatterns = [ 
    #通用视图 ListView 
    path('index/' , views.ProductList.as_view()) 
]

如果 URL 所指 向 的处理程序是 由通用视图执行的,那么在编写 URL 时, URL 所指向的处理程序应当是一个通用视图, 并且该通用视图上必须使用 as_view() 方法。

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值