ミドルウェアを使用して Django rotue で不足している変数をキャッチしようとしていますが、Django がビューを見つけることができないため (urlconf に存在する場合でも)、URL を逆にすることはできません。例えば:
このルートでは:
# matches /test and /game/test
url(r'^((?P<game>[A-Za-z0-9]+)/)?test', 'hyp.views.test'),
ゲーム部分が指定されていないかどうかを検出し、その場合はミドルウェアでリダイレクトしようとしています:
class GameMiddleware:
def process_view(self, request, view_func, view_args, view_kwargs):
if 'game' in view_kwargs:
game = view_kwargs['game']
if game is None:
# As a test, attempt to resolve the url
# Correctly finds ResolverMatch for hyp.views.test, game=TestGame
print resolve('/TestGame/test', urlconf=request.urlconf)
# Fails with "Reverse for 'hyp.views.test' with arguments '()'
# and keyword arguments '{'game': 'TestGame'}' not found."
return HttpResponseRedirect(reverse(
request.resolver_match.url_name, # 'hyp.views.test'
urlconf=request.urlconf,
kwargs={'game': 'TestGame'}
))
return None
request.urlconf
テスト URL が含まれています。
{ '__name__': 'urlconf', '__doc__': None, 'urlpatterns': [
<RegexURLPattern None ^$>,
<RegexURLPattern None ^((?P<game>[A-Za-z0-9]+)/)?test>
], '__package__': None }
私が考えることができる唯一のことは、URLリライタがオプションの部分を含む正規表現を処理できない可能性があるということです.これらの場合には別のビューを作成する方が良いでしょう(私はオプションのgame
パラメータ)または修正できますか?
アップデート
ルートのラッピングブラケットを削除することでなんとか動作させることができました(したがって、読み取りr'^(?P<game>[A-Za-z0-9]+/)?test'
、ゲームとして「TestGame /」を渡すことによって-ただし、game.rstrip('/')
毎回呼び出す必要があるため、これは理想的ではありません(ただし、ミドルウェアでのみ)) . で終わる名前が予想されるため{% url %}
、タグを使用することも困難です。/
誰かがより良い解決策を持っている場合に備えて、これを開いたままにしておきます。