まず当人のレベル感からお話しますと、
私は独学でpythonからプログラミング入門して4-5ヶ月程度です。
この度webアプリケーション制作を一からやってみようと思いdjangoを勉強し始めました。
まずは教材を一通りやってみたあと、今度は変数名やサイトのデザインなどを改変して
オリジナルを作っている最中ですが、テンプレートファイル内にリンクを貼ろうとしたところ
どうも動かないので、どこがおかしいのかご教示いただけると光栄です。
実現したいこと
テンプレート内のhtmlファイルに、modelのclassのidを引き渡して
jobs/3/
とか jobs/10/
とかのurlで個別ページに遷移するリンクを作りたい。
サイトイメージ
このオシゴト名をクリックするとオシゴト詳細画面(job_detail.html)に遷移するようなイメージです
ディレクトリ構造
![
project2
というプロジェクトがあり、その中にjobs
というアプリケーションを作っています。
今回はjobs
アプリケーション内のtemplates
ディレクトリ内のjobs
ディレクトリ内の、
job_index.html
の中にテンプレートエンジンを埋め込み、リンクから同列に配置している
job_detail.html
を参照できるようにしていきたいと思っています。
job_index.htmlの中身
html
1{% extends 'jobs/base.html' %} 2 3<head> 4 <meta charset="utf-8"> 5 <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> 6 <!-- Bootstrap CSS --> 7 <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous"> 8<title>オシゴトサーチ</title> 9</head> 10{% block content %} 11<h2>オシゴトを検索しよう。</h2> 12<div class="table-responsible"> 13<table class="table table-hover"> 14<thead> 15<tr class="success"> 16 <th></th> 17 <th>オシゴト名</th> 18 <th>エリア</th> 19 <th>公開日</th> 20 <th>オシゴト内容</th> 21 <th>報酬</th> 22</tr> 23</thead> 24 <tbody> 25 {% for recruit in recruits.all %} 26 <tr> 27 <td><img src="{{ recruit.icon.url }}" class="img-fluid rounded" alt="Responsive image" style="max-height: 50px;"></td> 28 <td><a href="#">{{ recruit.job_name }}</a></td> 29 <td>{{ recruit.area }}</td> 30 <td>{{ recruit.published }}</td> 31 <td>{{ recruit.summary }}...</td> 32 <td>{{ recruit.reward }}</td> 33 </tr> 34 {% endfor %} 35 </tbody> 36</table> 37</div> 38<br> 39<a href="#">ホームへ戻る</a> 40{% endblock %}
※ブロックコンテンツを適用し、共通レイアウト部分に関してはjobs/base.html
内に格納しています。
この2つある<a href="#">
にリンクを埋め込むのを目標としています
modelsファイルの中身
python
1from django.db import models 2 3 4class Recruit(models.Model): 5 job_name = models.CharField(max_length=30) 6 job_genre = models.CharField(max_length=30, blank=True) 7 area = models.CharField(max_length=30, blank=True) 8 company_name = models.CharField(max_length=30) 9 reward = models.IntegerField() 10 from_dates = models.DateField() 11 comments = models.TextField() 12 icon = models.ImageField(upload_to='media/', blank=True) 13 published = models.DateField() 14 points = models.IntegerField() 15 16 def __str__(self): 17 return self.job_name 18 19 def summary(self): 20 return self.comments[:20]
このRecruitクラスが暗にもつidをprimary keyとし、jobs/<id>/
のようなurl構成で詳細ページへ飛ばします。
viewsファイルの中身
python
1from django.shortcuts import render, get_object_or_404 2from django.http import HttpResponse 3from .models import Recruit 4 5 6def job_index(request): 7 recruits = Recruit.objects.order_by('-published') 8 return render(request, 'jobs/job_index.html', {'recruits': recruits}) 9 10 11def job_detail(request, job_id): 12 job = get_object_or_404(Recruit, pk=job_id) 13 return render(request, 'jobs/job_detail.html', {'job': job})
project2/urls.py(プロジェクト全体のurl設定)の中身
python
1from django.contrib import admin 2from django.conf.urls import include, url # 他のアプリケーションを読み込むためのinclude 3from django.conf.urls.static import static # 静的ファイルを扱うための設定 4from django.conf import settings # settings.pyを読み込む。*staticを先にimportしないといけない 5from jobs import views 6 7 8urlpatterns = [ 9 url(r'^jobs/', include('jobs.urls')), # jobsの中にあるurls.pyを参照する 10 url(r'^admin/', admin.site.urls), 11 url(r'^jobs/(?P<job_id>[0-9]+)/$', views.job_detail, name="job_detail"), 12 ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
django2.1.2で開発していますが、正規表現によるurlパターンを作っています。
django2以降からpathを使ってurlを記述しやすくなったとの話がありますが、よくわかっていません...
jobs/urls.py(個別アプリケーションのurl設定)の中身
python
1from django.conf.urls import url 2from . import views 3 4urlpatterns = [ 5 url(r'^$', views.job_index, name='job_index'), 6]
さて、ではいよいよテンプレートエンジンを使ってリンクを作成します
job_index.html
の#のところに、{% url 'job_detail' job.id %}
を挿入すれば、リンクが通るはずなんですが。。
リロードしたらエラーしました。
ちなみに、アドレスバーに/jobs/3/を打ち込むと、詳細ページは表示されるのでurl設定が間違っていると思われます。
考えられるエラー要因
Reverse for 'job_detail' with arguments '('',)' not found. 1 pattern(s) tried: ['jobs/(?P<job_id>[0-9]+)/$']
とのことですから、viewsファイルで設定したjob_detailがパターンマッチせずうまく読めていないということだと思いますが...なぜなのか?わかりません。
url設定についてまだよくわかっておらず、これを機に理解を深めたいと思いますので、
教えていただけると幸いです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/11/09 15:38
2018/11/10 01:30
2018/11/17 08:38
2018/11/17 09:19