Django中URL的参数传递的实现


Posted in Python onAugust 04, 2019

在Django中有非常强大的URL模块,可以按照开发者的想法来制定清晰的URL,同时支持正则表达式。此外,在URL中还可以传递参数。

1. Django处理请求的方式

1) Django通过URLconf模块来进行判断。通常情况下,这就是ROOT_URLCONF配置的价值,但是如果请求携带了一个urlconf的属性(通常被中间件设置),那么这个被携带的urlconf将会替代ROOT_URLCONF的配置。

2) Django会调用Python模块并寻找各种urlpatterns。这是一个属于django.conf.urls.url()实例的python列表。

3) Django会遍历每个URL pattern,自上而下,并且选取收割匹配请求URL的pattern。

4) 一旦匹配某个url pattern的正则表达式,Django将导入并调用相关的view(这是一个简单的python函数,或者是一个class-based view)

这个view将会传递下列参数:

  • 一个HttpRequest的实例
  • 如果匹配了URL中一个no named group,那么参数将会按根据URL中的位置一一对应
  • 如果匹配了URL中一个named group,且参数传递是通过named group来匹配的,那么参数将会被指定的kwargs代替。

5)  如果没有任何一个正则表达式被匹配,那么Django会抛出异常,并报错。

2.URL中的named  group

URL可以通过named group方式传递指定参数,语法为: (?P<name>pattern), name 可以理解为所要传递的参数的名称,pattern代表所要匹配的模式。例如,

url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive),

那么year,month将会对应views传递过来的year,month的值,而后面紧跟的则代表正则表达匹配的模式。

3. URL的反向解析

通常来说在处理完一个表单之后,网页会发生跳转。通常写URL我们都避免硬编码,这样不方便后期的调整。通常我们需要从URL获取两种内容,最主要是view能够通过URL获取一些标识并处理,另一些信息则是传递过来的参数。
Django提供了一种解决方案,URL mapper是与URL设计一一对应。你可以通过URLconf来实现,并反向使用它。例如,

  1. 由用户通过浏览器发起URL请求,调用view,并将URL中的参数传递给view
  2. 通过view并附上相应参数,找到相应匹配的URL。

后者我们称之为对URLs的反向解析。反向解析的例子,

url(r'^articles/([0-9]{4})/$', views.year_archive, name='news-year-archive'),

Django在不同的层次也提供了一些工具来实现URL的反向解析。

  1. 在template中:使用url标签
  2. 在python中:使用django.core.urlresolvers.reverse()函数
  3. 在更高层次处理model实例时,可以使用get_absolute_url()方法

4. 利用URL来完成Device,Line表的增加功能

对于信息系统,我们可以把Node,Device, Line都看成是一种资源,对其中任何一种要素的修改,都是对资源的修改,只是会落实到不同的表中,但是在程序中可以一样看到。现在,我们就基于上一节的代码做些修改。

1)修改URL的配置,将原来的add对应的url进行扩充

urls.py:

from django.conf.urls import url
from django.contrib import admin
import echo.views
 
urlpatterns = [
  url(r'^admin/', admin.site.urls),
  #内容显示,并通过定义name,来进行反向解析
  url(r'^lists/(?P<table>\w+)/$', echo.views.lists, name='lists'),
  #增加内容
  url(r'^add/(?P<table>\w+)/$', echo.views.add, name='add'),
]

2) 修改views的函数的参数,在request后加入table,使该函数能够用于所有表格。request是views函数中必须要有的参数。

views.py:

# -*- coding: UTF-8 -*-
from .models import Node,Line,Device
from forms import NodeForm,LineForm,DeviceForm
from django.shortcuts import render, redirect
# Create your views here.
 
def lists(request, table):
  #从根据不同的请求,来获取相应的数据,并跳转至相应页面
  if table == 'node':
    data = Node.objects.all()
    list_template = 'node_list.html'
  if table == 'line':
    data = Line.objects.all()
    list_template = 'line_list.html'
  if table == 'device':
    data = Device.objects.all()
    list_template = 'device_list.html'
  #建立context字典,将值传递到相应页面
  context = {
    'data': data,
  }
  #跳转到相应页面,并将值传递过去
  return render(request,list_template,context)
 
def add(request, table):
 
  #根据提交的请求不同,获取来自不同Form的表单数据
  if table == 'node':
    form = NodeForm(request.POST or None)
  if table == 'line':
    form = LineForm(request.POST or None)
  if table == 'device':
    form = DeviceForm(request.POST or None)
  #判断form是否有效
  if form.is_valid():
    #创建实例,需要做些数据处理,暂不做保存
    instance = form.save(commit=False)
    #将登录用户作为登记人
    if table == 'node':
      instance.node_signer = request.user
    if table == 'line':
      instance.line_signer = request.user
    if table == 'device':
      instance.device_signer = request.user
    #保存该实例
    instance.save()
    #跳转至列表页面,配合table参数,进行URL的反向解析
    return redirect('lists', table=table)
 
  #创建context来集中处理需要传递到页面的数据
  context = {
    'form': form,
  }
  #如果没有有效提交,则仍留在原来页面
  return render(request, 'add.html', context)

3)在template中建立相关页面:

add.html:

<!DOCTYPE html>
<html>
<head lang="en">
  <meta charset="UTF-8">
  <title></title>
</head>
<body>
 <form method='POST' action=''>{% csrf_token %}
    {{ form }}
    <input type='submit' value='提交' />
 </form>
 
</body>
</html>

device_list.html:

<!DOCTYPE html>
<html>
<head lang="en">
  <meta charset="UTF-8">
  <title></title>
</head>
<body>
  <table>
    <tr>
      <th>设备名称</th>
      <th>设备型号</th>
    </tr>
    {% for item in data %}
      <tr>
        <td>{{ item.device_caption }}</td>
        <td>{{ item.device_type }}</td>
      </tr>
    {% endfor %}
  </table>
</body>
</html>

line_list.html:

<!DOCTYPE html>
<html>
<head lang="en">
  <meta charset="UTF-8">
  <title></title>
</head>
<body>
  <table>
    <tr>
      <th>线路名称</th>
      <th>线路速率</th>
      <th>线路类型</th>
    </tr>
    {% for item in data %}
      <tr>
        <td>{{ item.line_code }}</td>
        <td>{{ item.line_speed }}</td>
        <td>{{ item.line_type }}</td>
      </tr>
    {% endfor %}
  </table>
</body>
</html>

node_list.html:

<!DOCTYPE html>
<html>
<head lang="en">
  <meta charset="UTF-8">
  <title></title>
</head>
<body>
  <table>
    <tr>
      <th>节点名称</th>
      <th>节点地址</th>
      <th>节点类型</th>
    </tr>
    {% for item in data %}
      <tr>
        <td>{{ item.node_name }}</td>
        <td>{{ item.node_address }}</td>
        <td>{{ item.node_type }}</td>
      </tr>
    {% endfor %}
  </table>
</body>
</html>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python科学计算环境推荐——Anaconda
Jun 30 Python
Python制作钉钉加密/解密工具
Dec 07 Python
python 性能优化方法小结
Mar 31 Python
python3+PyQt5图形项的自定义和交互 python3实现page Designer应用程序
Jul 20 Python
Python函数基础实例详解【函数嵌套,命名空间,函数对象,闭包函数等】
Mar 30 Python
python实现自动化上线脚本的示例
Jul 01 Python
用Python将Excel数据导入到SQL Server的例子
Aug 24 Python
Flask框架搭建虚拟环境的步骤分析
Dec 21 Python
python实现拼图小游戏
Feb 22 Python
python实现时间序列自相关图(acf)、偏自相关图(pacf)教程
Jun 03 Python
python使用opencv resize图像不进行插值的操作
Jul 05 Python
Python实现Appium端口检测与释放的实现
Dec 31 Python
Python 操作 ElasticSearch的完整代码
Aug 04 #Python
python elasticsearch从创建索引到写入数据的全过程
Aug 04 #Python
elasticsearch python 查询的两种方法
Aug 04 #Python
python Elasticsearch索引建立和数据的上传详解
Aug 04 #Python
Django 创建新App及其常用命令的实现方法
Aug 04 #Python
python模拟鼠标点击和键盘输入的操作
Aug 04 #Python
python PyAutoGUI 模拟鼠标键盘操作和截屏功能
Aug 04 #Python
You might like
PHP has encountered an Access Violation
2007/01/15 PHP
php实现的仿阿里巴巴实现同类产品翻页
2009/12/11 PHP
PHP的preg_match匹配字符串长度问题解决方法
2014/05/03 PHP
PHP实现对文本数据库的常用操作方法实例演示
2014/07/04 PHP
php之Smarty模板使用方法示例详解
2014/07/08 PHP
thinkphp3.x连接mysql数据库的方法(具体操作步骤)
2016/05/19 PHP
PHP会员找回密码功能的简单实现
2016/09/05 PHP
Ubuntu彻底删除PHP7.0的方法
2018/07/27 PHP
thinkPHP5.1框架使用SemanticUI实现分页功能示例
2019/08/03 PHP
bcastr2.0 通用的图片浏览器
2006/11/22 Javascript
一步一步制作jquery插件Tabs实现过程
2010/07/06 Javascript
原生Js实现按的数据源均分时间点幻灯片效果(已封装)
2010/12/28 Javascript
jQuery学习笔记 更改jQuery对象
2012/09/19 Javascript
Javascript基础 函数“重载” 详细介绍
2013/10/25 Javascript
js window.onload 加载多个函数和追加函数详解
2014/01/08 Javascript
用js替换除数字与逗号以外的所有字符的代码
2014/06/07 Javascript
NodeJS整合银联网关支付(DEMO)
2016/11/09 NodeJs
vue实现单选和多选功能
2017/08/11 Javascript
原生JS实现图片无缝滚动方法(附带封装的运动框架)
2017/10/01 Javascript
vue实现长图垂直居上 vue实现短图垂直居中
2017/10/18 Javascript
Vue.js在数组中插入重复数据的实现代码
2017/11/17 Javascript
简单的React SSR服务器渲染实现
2018/12/11 Javascript
JS性能优化实现方法及优点进行
2020/08/30 Javascript
vue项目打包后请求地址错误/打包后跨域操作
2020/11/04 Javascript
微信小程序跳一跳游戏 python脚本跳一跳刷高分技巧
2018/01/04 Python
啥是佩奇?使用Python自动绘画小猪佩奇的代码实例
2019/02/20 Python
使用python写的opencv实时监测和解析二维码和条形码
2019/08/14 Python
Python datetime 格式化 明天,昨天实例
2020/03/02 Python
Python如何通过百度翻译API实现翻译功能
2020/04/02 Python
OpenCV Python实现图像指定区域裁剪
2021/03/12 Python
康帕斯酒店预订:Compass Hospitality(支持中文)
2018/08/23 全球购物
世界上最受欢迎的花店:1-800-Flowers.com
2020/06/01 全球购物
工作总结之小学教师体育工作范文(3篇)
2019/10/07 职场文书
2019年最新感恩节祝福语(28句)
2019/11/27 职场文书
用Python简陋模拟n阶魔方
2021/04/17 Python