[MEMO] djangoのreverseとdecorator
2008.06.15 Sunday 11:14
Djangoのreverseではまる.ログインを強制するために @login_requiredを使っている場合はURLを名前付きで定義しないと urlresolvers.reverse が使えない.
django/core/urlresolvers.py を見ればわかるが,
urlresolverで使う辞書がRegexURLResolverオブジェクトのreverse_dictに入っている.以下の手順で内容を確認してみる.
すると,関数またはオブジェクトとRegexURLResolverないしはRegexURLPatternの対応表が入っているのが見える.RegexURLPatternはurls.pyの各行に対応するオブジェクト.いずれもオブジェクトの表示に対応するURLパターンが含まれているから大体わかる.
その中から問題のパターンに対応するキーを見てみると,
urls.pyで (r"pattern/$", views.function) のようになっていたところを url(r"pattern/$", views.function, name="pattern.function")のように直して,上の手順でreverse_dictの中身を見てみると,nameで追加した文字列キー(pattern.function)がキーとして追加されているのが確認できる.
urlresolverで使う辞書がRegexURLResolverオブジェクトのreverse_dictに入っている.以下の手順で内容を確認してみる.
manage.py shell
import urls
from django.core import urlresolvers
res = urlresolvers.get_resolver(None)
res.reverse_dict
すると,関数またはオブジェクトとRegexURLResolverないしはRegexURLPatternの対応表が入っているのが見える.RegexURLPatternはurls.pyの各行に対応するオブジェクト.いずれもオブジェクトの表示に対応するURLパターンが含まれているから大体わかる.
その中から問題のパターンに対応するキーを見てみると,
<django.contrib.auth.decorators._CheckLogin object at 0x014C1750>と,@login_requiredによって生成された関数が表示されている.
urls.pyで (r"pattern/$", views.function) のようになっていたところを url(r"pattern/$", views.function, name="pattern.function")のように直して,上の手順でreverse_dictの中身を見てみると,nameで追加した文字列キー(pattern.function)がキーとして追加されているのが確認できる.
Comments