在Django命名空间下,能否用视图函数作为reverse/redirect的to参数?
问题原因与解决办法
当给Django应用设置app_name(应用命名空间)后,直接通过视图函数对象调用redirect()触发NoReverseMatch错误,这是Django的预期行为——此时仅通过视图函数本身,Django无法确定它所属的命名空间,也就无法正确反转出对应的URL。而未设置app_name时,视图属于全局命名空间,reverse可以直接通过函数找到对应的URL模式。
可行的解决办法
1. 给URL模式命名,用命名空间+名称的字符串调用redirect
先在urls.py中给目标视图的URL模式添加name参数:
# urls.py from django.urls import path from .views import some_other_view, some_view app_name = 'foo_app' urlpatterns = [ path('some_other_view/', some_other_view), path('some_view/', some_view, name='some_view'), # 添加name参数 # ... ]
然后在视图中通过命名空间+名称的字符串调用redirect():
# views.py from django.shortcuts import redirect def some_other_view(request): return redirect('foo_app:some_view') # 使用命名空间限定的名称
2. 手动调用reverse指定命名空间,再传入redirect
如果需要更灵活的操作,可以显式调用reverse()并指定命名空间,再将结果传给redirect():
# views.py from django.shortcuts import redirect from django.urls import reverse def some_other_view(request): url = reverse('foo_app:some_view') return redirect(url)
3. 使用相对命名空间(同应用内视图可选)
如果两个视图属于同一个应用命名空间,也可以用相对命名空间写法(比如:some_view),但显式指定完整命名空间的写法更清晰,能避免潜在的命名冲突。
内容的提问来源于stack exchange,提问作者Klaas van Schelven
相关产品推荐
相关产品推荐

