如何通过request.resolver_match.kwargs从Django Admin URL获取模型名?
获取Django Admin URL中的模型名
我来帮你解决这个Django Admin的URL参数问题~
首先,先明确Django Admin默认的URL规则:对于像http://127.0.0.1:8000/admin/foo/bar/这样的路径,foo是app标签,bar是模型名(model_name),对应的是该模型的列表视图(changelist)。按照常规配置,request.resolver_match.kwargs里应该包含app_label和model_name这两个键,用来分别获取foo和bar。
你提到model_name返回None,可能需要先排查几个点:
- 有没有自定义过AdminSite或者修改过Admin的URL模式?如果是自定义配置,可能会改变默认的kwargs键名。
- 你是在哪个环节获取这个值的?比如在中间件中,是否在URL解析完成前就尝试获取了?
- 可以先打印
request.resolver_match的完整信息来排查:
看看里面的print(request.resolver_match.__dict__)kwargs字段到底包含哪些键,这样能快速定位问题所在。
如果确实无法通过kwargs直接获取,除了你用的request.resolver_match.url_name.split('_')[1]方法,还有几个更直接的替代方案:
- 如果你是在ModelAdmin的自定义方法或Admin模板中,可以直接从模型的元数据获取:
# 在ModelAdmin类的方法里 model_name = self.model._meta.model_name - 通过
view_name拆分:request.resolver_match.view_name的格式一般是app_label_model_name_changelist,拆分后也能拿到模型名:view_name = request.resolver_match.view_name model_name = view_name.split('_')[1]
总的来说,优先排查model_name为None的原因(大概率是URL配置或获取时机的问题),如果实在绕不开,拆分url_name或view_name是简单可靠的替代方法,而在Admin内部逻辑里直接访问模型元数据则是最直接的方式。
内容的提问来源于stack exchange,提问作者drec4s
相关产品推荐
相关产品推荐

