You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 23:06:32