[Django3.0]idを引数にしたurlの設定

顧客IDをurlのパスに設定して、顧客詳細ページや顧客編集ページを表示させたい。

e.g. http:*/client/detail/${clientId}

### urls.py、views.pyを修正する

/sales/urls.py

urlpatterns = [
	// 省略
	path('client/detail/<int:id>', views.client_detail, name='client_detail'),
	// 省略
]

/sales/views.py

def client_detail(request, id):
	client = Clients.objects.get(id=id)
	params = {
		'client' : client
	}
	return render(request, 'sales/client_detail.html', params)

/templates/sales/client_detail.html

// 省略
{% block title %}{{client.name}} | hanbai - 得意先詳細:{{client.name}}の詳細を表示しています{% endblock %}
// 省略

<table class="table">
					<tr>
						<td class="bg">会社名</td>
						<td>{{client.name}}</td>
						<td class="bg">会社名カナ</td>
						<td>{{client.name_kana}}</td>
					</tr>
					<tr>
						<td class="bg">事業所名</td>
						<td>{{client.office}}</td>
						<td class="bg">部署</td>
						<td>{{client.department}}</td>
					</tr>
					<tr>
						<td class="bg">担当者名</td>
						<td>{{client.charge}}</td>
						<td class="bg">役職</td>
						<td>{{client.position}}</td>
					</tr>
					<tr>
						<td class="bg">メールアドレス</td>
						<td colspan="3">{{client.charge_mail}}</td>
					</tr>
					<tr>
						<td class="bg">住所</td>
						<td colspan="3">{{client.zipcode}} {{client.prefecture}}{{client.address}}</td>
					</tr>
					<tr>
						<td class="bg">電話</td>
						<td>{{client.tel}}</td>
						<td class="bg">FAX</td>
						<td>{{client.fax}}</td>
					</tr>
					<tr>
						<td class="bg">代表者</td>
						<td>{{client.name_top}}</td>
						<td class="bg">役職</td>
						<td>{{client.position_top}}</td>
					</tr>
					<tr>
						<td class="bg">備考</td>
						<td colspan="3">{{client.remark}}</td>
					</tr>
				</table>
// 省略

idを引数に上手く表示されています。

ただし、引数のidがレコードにないと、”Clients matching query does not exist.”と表示されてしまう。

### try & except
以下のように書けば、レコードがない場合、一覧ページに表示されます。

def client_detail(request, id):
	try:
		client = Clients.objects.get(id=id)
		params = {
			'client' : client
		}
		return render(request, 'sales/client_detail.html', params)
	except Clients.DoesNotExist:
		data = Clients.objects.all()
		params = {
			'data' : data
		}
		return render(request, 'sales/client.html', params)

クライアント一覧ページのリンクを以下のように修正して結合テストを行えばOK。

<button class="btn btn-light" onclick="location.href='/client/detail/{{item.id}}'">詳細</button>

ページング以外でGetパラメータを使用するのは抵抗がありますね。