前置き
テキスト『python django超入門』(秀和システム)をやっているところで、テキスト通りに入力してエラーが発生しました。出版社提供の正誤表に記載がなかったので勉強を兼ね投稿させていただきました。
テキストではhelloアプリケーションを作成しています。
実行環境
django:3.0.2
python:3.7.4
OS:macOS Mojave 10.14.6
エラー内容
それは、2-2のP.82(複数ページの移動)をやっていた時に起こりました。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>{{ title }}</title>
</head>
<body>
<h1>{{ title }}</h1>
<p>{{ msg }}</p>
<p><a href="{% url goto %}">{{ goto }}</a></p>
</body>
</html>
# 修正前
# index()のみ抜粋
def index(request):
params = {
'title': 'Hello/index',
'msg': 'これは、サンプルで作ったページです。',
'goto': 'next',
}
return render(request, 'hello/index.html', params)
この状態でindex.htmlにアクセスすると下記エラーが発生しました。
NoReverseMatch at /hello/
Reverse for 'next' not found. 'next' is not a valid view function or pattern name.
「next」って??と怒られています。。。
#おかしいな、何度見直してもテキスト通りなんだけど。。。
原因、解決方法
結論から書くと、views.py内の'goto'の書き方が原因でした。
下記の通りに修正したら正常になりました。
# 5行目
# 変更前:
'goto': 'next',
# 変更後:
'goto': 'hello:next',
リンク部分の表示がテキストと違っていますが、そこは本質ではないのでここでは触れません。
(テキストでは「next」だけが表示されることになっている)
原因は、index.html内のテンプレート{% url goto %}部分に正しい書式で送信されていないためでした。
goto部分の書式は'アプリ名:name'となるはずが、nameしか来ていないので不整合が起きていました。
あとがき
上記は出版社サポートページの正誤表に記載がなく、同じ部分でつまづく人がいるかもと思い、自身の勉強を兼ねて投稿させていただきました。
私自身djangoはまだ勉強中ですので、ツッコミなどありましたらお願いしますm(_ _)m