eCommerce 2 part9 Urls within Django App
Appフォルダ内の Urls.py を設定する
- まず、projectrootのurls.py の設定をする。
rlpatterns = [ url(r'^products/', include('products.urls')), ]
ここでは、$マークをつけないように注意。
products/urls.py を新規作成する。そして、元のurls.pyの内容をコピペ
products/urls.py はとりあえずコメントアウトしておく。
cfe githubのcommon regular expressions for django urls は役に立つので、ここを活用する。
Guides/common_url_regex.md at master · codingforentrepreneurs/Guides · GitHub
- products/urls.py の設定例
urlpatterns = [ url(r'^(?P<id>\d+)$', 'products.views.product_detail_view_func', name='products_detail_function'), ]
↑ これで, viewにidを渡せる。さらに、渡すviewの関数を指定できる。ここでは、views.product_detai_view_func。さらに、name= で、reverseで使うnameを決められる。
上記を設定してみて、 http://127.0.0.1:8000/products/1 にアクセスすると、template does not existが表示されるため、とりあえずurlの設定はあってる。 あとは、templateを設定するだけ。
ただその前に、class based viewがいかに楽かを体験する。
products/urls.py に以下のコードを追加する。viewsからclass based viewを継承したclassをimportするだけ。
from .views import ProductDetailView ``` 2. 次に、以下のように、urlpattersを設定してみる。
url(r'^cbv/(?P<id>\d+)$', ProductDetailView.as_view(), name='products_detail'),
cbvは、他と区別をつけるためにつけただけ。さっきviewの関数を入れた真ん中には、classの名前.as_view() というメソッドを入れる。nameは、同じ意味。 3. これでproducts/cbv/ にアクセスすると、 Generic detail view ProductDetailView must be called with either an object pk or a slug. というattribute errorが出る。 つまり、class based view は、pk かslugでしか呼び出せないというerror。 4. なので、以下のように、urlpatternsを修正してみる。
url(r'^cbv/(?P<pk>\d+)$', ProductDetailView.as_view(), name='products_detail'),
5. 再度アクセスすると、template does not existになるので、これで無事設定されたとわかる。 # class based viewの現時点でわかっているルール? * pk かslugでしか呼び出せない * template_name = "<appname>/<modelname>_detail.html" が自動で、参照される * cbvは、idが無いレコードについては、404 errorを返すが、view関数は、設定しないと404errorを返さない。