iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 20
0
Modern Web

From Django 1.11 to Django 2.1 系列 第 20

Day20 : 動態網址 - path 應用

Day13 我們已經見識到的 Django 2 中 path 的強大,它可以讓我們不須透過regex的方式,便能幫助我們處理掉許多網址對應的問題

我們今天就來看看要如何實際操作這個傢伙吧 ^^


[正文開始]

這是我們原先 urls.pyviews.py 的模樣

# urls.py
from django.contrib import admin
from django.urls import path

from . import views

urlpatterns = [
    path('', views.showtemplate),
    ...略
]

# views.py
def showtemplate(request):
    vendor_list = Vendor.objects.all()
    context = {'vendor_list': vendor_list}
    # print(vendor_list)
    return render(request, 'vendors/vendor_detail.html', context)

上面所做的事情,是將所有 Vendor 的資料顯示到 vendor_detail.html 裡面

那今天要在單獨的介面顯示一筆一筆的資料,那要怎麼完成呢?

一開始我們要將 urls.py 加上這一段,我們要將每一個攤販的 id 傳至 views 的 singleVendor

urlpatterns = [
    path('<int:id>/', views.singleVendor, name='vendor'),
    ...略
]

接著到 views 新增 singleVendor 的 函式

def singleVendor(request, id):
    vendor_list = Vendor.objects.get(id=id)
    context = {
        'vendor_list': vendor_list
    }
    return render(request, 'vendors/vendor_detail.html', context)

在這裡要注意到的是,在函式除了 request,還多加了一個 id,而這個參數是對應到 urls.py 裡面 <int:id>

也就是說!! urls 裡面放置的參數,必須要與我們函式傳入的參數相同!!

https://ithelp.ithome.com.tw/upload/images/20181020/201118293UYBRSeVZF.png

如果你使用了不一樣的參數名稱,也就是說把 urls.py 的 id 改成 my_id

path('<int:my_id>/', views.singleVendor, name='vendor')

那麼最後就只會被狠狠報錯一頓,因為在singleVendor函式所帶的參數不是 my_id 而是 id
https://ithelp.ithome.com.tw/upload/images/20181020/201118294H7gOu9MXz.jpg


接著就能來看我們的成果了

執行 python manage.py runserver 前往 http://127.0.0.1:8000/vendor/1/

就可以看到 ...錯誤! 什麼!?

https://ithelp.ithome.com.tw/upload/images/20181020/20111829G0WKpN2S7A.jpg

理由很簡單 ^^"

我原本在 vendor_detail.html 撰寫的內容如下

{% extends "base.html" %}
{% block title %} My store {% endblock %}
{% block content%}
{% for vlist in vendor_list %}
  <h1> 店家 : {{vlist.vendor_name}} </h1>
  <ul>
    <li>店名 : {{ vlist.store_name}}</li>
    <li>電話 : {{ vlist.phone_number}}</li>
    <li>地址 : {{ vlist.address}}</li>
  </ul>
{% endfor %}
{% endblock %}

因為今天當我並不是想要取多筆,而只想要取得一筆的時候,它只是一個 物件 而已,因此不具備可 迭代(iterable) 的特性

因此我們的 vendor_detail.html 要修改成這樣, 也就是把 for loop 拿掉,並修改相對應的變數

{% extends "base.html" %}
{% block title %} My store {% endblock %}
{% block content%}
<h1> 店家 : {{vendor_list.vendor_name}} </h1>
<ul>
  <li>店名 : {{ vendor_list.store_name}}</li>
  <li>電話 : {{ vendor_list.phone_number}}</li>
  <li>地址 : {{ vendor_list.address}}</li>
</ul>
{% endblock %}

如此一來,我們便能在該頁面http://127.0.0.1:8000/vendor/1/成功取得一筆資料囉!

https://ithelp.ithome.com.tw/upload/images/20181020/20111829gtlyaqwPA2.jpg


今天帶大家看一個簡易的 path 使用方法,透過相對簡易的方式,便能達到想要的效果 ^^

今天先講到這,我們明天見!!

Simple is better than Complex From Vitor Freitas


上一篇
Day19 : Django Form
下一篇
Day 21 : 網頁例外
系列文
From Django 1.11 to Django 2.1 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
maloyang
iT邦新手 5 級 ‧ 2019-10-23 13:28:59

關於這一行 vendor_list = Vendor.objects.get(id=id)
可能改成 vendor_one = Vendor.objects.get(id=id) 在意思上可能比較好
--> 因為 這邊vendor_list已不是list,而是一個dict

我要留言

立即登入留言