中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

使用Django怎么傳遞URL參數

發布時間:2021-04-19 18:12:57 來源:億速云 閱讀:217 作者:Leah 欄目:開發技術

本篇文章為大家展示了使用Django怎么傳遞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>

上述內容就是使用Django怎么傳遞URL參數,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

大同县| 高碑店市| 宜阳县| 玉环县| 西峡县| 东乡族自治县| 柞水县| 卓尼县| 雅安市| 老河口市| 温州市| 会理县| 新巴尔虎右旗| 巴彦淖尔市| 广平县| 上蔡县| 乐至县| 城市| 宝清县| 大悟县| 镇远县| 栾川县| 合阳县| 黑山县| 潜山县| 新沂市| 榆树市| 临漳县| 白沙| 贵定县| 宜城市| 岳西县| 金乡县| 哈密市| 昭觉县| 赤峰市| 瑞安市| 长葛市| 清丰县| 吉林市| 遂平县|