Djangoroidの奮闘記

python,django,angularJS1~三十路過ぎたプログラマーの奮闘記

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を返さない。