如何基于字符串列表自动生成Django的urlpatterns?
问题
我有一个用于定义Django布局模板导航栏的字符串列表,希望复用该列表作为视图函数名,通过循环在urls.py中生成对应的urlpatterns。示例如下:
menu = ["register", "login", "logout"] urlpatterns = [path("", views.index, name="index"),]
我希望最终得到:
urlpatterns = [ path("", views.index, name="index"), path("/register", views.register, name="register"), path("/login", views.login, name="login"), path("/logout", views.logout, name="logout"), ]
我能正确传递路由字符串和kwargs字典,但无法将字符串转换为可调用的视图函数对象。请问这是否可行?我尝试了以下代码,但均无效:
for i in menu: url = f'"/{i}"' #传递给path()时有效 rev = {"name": i} #传递给path()时有效 v = f"views.{i}" #此方法无效 v = include(f"views.{i}", namespace="myapp") #此方法同样无效 urlpatterns.append(path(url, v, rev))
解决方案
完全可行,问题出在你试图用字符串"views.{i}"直接作为视图函数——这只是个字符串,不是实际的可调用函数对象。你需要从views模块中通过属性名获取对应的函数,用getattr()方法就能实现。
另外注意你的url变量多套了一层引号,直接生成f"/{i}"即可,不需要额外加双引号。
修改后的代码如下:
from django.urls import path import views menu = ["register", "login", "logout"] urlpatterns = [path("", views.index, name="index"),] for item in menu: # 从views模块中获取对应名称的视图函数 view_func = getattr(views, item) # 生成路由路径 route = f"/{item}" # 添加到urlpatterns urlpatterns.append(path(route, view_func, name=item))
执行后就能得到你期望的urlpatterns结构。如果视图函数分布在其他模块,先导入对应模块,再用getattr()获取即可。
内容的提问来源于stack exchange,提问作者VikSil
相关产品推荐
相关产品推荐

