基于变量值调用函数及Django中通过当前URL获取对应模型的实现问询
解决你的两个需求
需求一:使用变量中的值调用函数
根据变量存储的内容不同,有几种实用的实现方式:
- 如果变量直接存的是函数对象,直接调用即可:
def greet(): print("Hi there!") func_var = greet func_var() # 输出: Hi there! - 如果变量存的是函数名的字符串,可以通过全局/局部命名空间获取函数后调用:
def greet(): print("Hi there!") func_name = "greet" globals()[func_name]() # 从全局命名空间取函数并调用 - 如果是类/对象的方法,用
getattr()来获取并调用:class Person: def say_hello(self): print("Hello from Person!") p = Person() method_name = "say_hello" getattr(p, method_name)() # 调用对象的方法
需求二:Django中通过当前URL获取对应模型
你原来的思路方向是对的,但resolve返回的url_name是字符串,不是模型类,所以直接.objects.all()肯定会报错。下面是可行的实现方案:
1. 建立URL名称与模型的映射字典
首先在项目里维护一个字典,把每个URL名称和对应的模型类关联起来——这是核心步骤,因为字符串没法直接对应模型:
# 假设你的模型在blog/models.py里 from blog.models import Post, Comment, Tag # 键是URL的name值,值是对应的模型类 url_to_model = { "post_list": Post, "comment_list": Comment, "tag_list": Tag, # 继续添加其他URL和模型的对应关系 }
2. 在视图中获取模型并查询
然后在视图里,拿到url_name后从字典取模型,再执行查询:
from django.urls import resolve from django.shortcuts import render def common_list_view(request): # 获取当前URL的名称 current_url_name = resolve(request.path_info).url_name # 从映射字典中拿到对应的模型类 target_model = url_to_model.get(current_url_name) context = {} if target_model: # 调用模型的objects.all()获取所有对象 context["example"] = target_model.objects.all() else: # 处理URL名称不在映射中的情况,比如返回空或者提示 context["example"] = None return render(request, "your_template.html", context)
为什么你的原代码会失败?
你的原代码:
a = resolve(request.path_info).url_name context = { 'example' : a.objects.all }
这里的a是一个字符串(比如"post_list"),字符串类型根本没有objects这个属性,所以会抛出AttributeError。必须先把字符串转换成对应的模型类对象,才能调用它的管理器方法。
可选优化:自动生成映射(进阶)
如果不想手动维护字典,可以在URL配置的时候给每个URL的name带上模型标识,或者用装饰器给视图绑定模型,但手动维护映射是最直接、最容易调试的方式,适合大多数场景。
内容的提问来源于stack exchange,提问作者Avikshith
相关产品推荐
相关产品推荐

