Django动态获取自定义模型Aqtau时触发AttributeError问题求助
问题解决:Django Update视图无法找到自定义模型
错误原因
你在update视图中使用getattr(models, city_name)时,这里的models是导入的django.db.models模块,但你的Aqtau模型定义在**自己应用的models.py**中,并非Django内置的models模块,因此会抛出AttributeError。
修复步骤
1. 正确导入自己应用的models模块
在视图所在的views.py文件顶部,替换原有的django.db.models导入,改为导入自己应用的models:
from django.shortcuts import render, get_object_or_404 from . import models # 导入当前应用的models模块,若应用名不同可改为 from your_app_name import models
2. 修改Update视图代码
更新视图,确保从自己的models模块中获取模型类,同时用get_object_or_404处理不存在的记录,用render简化模板渲染:
def update(request, city_name, id): # 尝试获取指定的模型类 try: model = getattr(models, city_name) # 验证是否为Django模型子类,防止非法输入 if not issubclass(model, models.Model): raise AttributeError except AttributeError: return HttpResponse("无效的城市名称", status=404) # 获取指定ID的记录,不存在则返回404 mymember = get_object_or_404(model, id=id) return render(request, 'update.html', {'mymember': mymember})
可选优化:避免硬编码模型名称到URL
将模型名称暴露在URL中存在安全风险(比如用户可以尝试输入其他模型名),更优雅的方式是:
- 统一用一个模型存储所有城市数据(比如
CityData,添加city_name字段区分不同城市),而非为每个城市创建单独模型 - 若必须保留多模型结构,可在视图中做固定映射:
MODEL_MAP = { 'aqtau': models.Aqtau, # 其他城市模型映射 } def update(request, city_slug, id): model = MODEL_MAP.get(city_slug.lower()) if not model: return HttpResponse("无效的城市", status=404) mymember = get_object_or_404(model, id=id) return render(request, 'update.html', {'mymember': mymember})
内容的提问来源于stack exchange,提问作者Aibek9898
相关产品推荐
相关产品推荐

