使用flask-mongoengine生成ModelForm时触发AttributeError报错求助
基于Mongo Document生成ModelForm时出现AttributeError的解决方法
问题场景
在主项目中遇到问题后,创建独立测试项目复现:尝试基于MongoDB创建数据库并生成表单,运行时报错。
原代码(app.py)
from flask_mongoengine.wtf import model_form from flask_mongoengine import MongoEngine from flask import render_template,request,Blueprint,Flask app=Flask(__name__) db= MongoEngine() app.config['MONGODB_SETTINGS']={'db':'project_database','host':'localhost','port':27017,'alias':'default'} #assign app to database db.init_app(app) class Test1(db.Document): in1=db.StringField() in2=db.StringField() in3=db.StringField() @app.route('/',methods=['GET','POST']) def index(): test=model_form(Test1()) return render_template('inedx.html',test=test) app.run(debug=True)
报错信息
Traceback (most recent call last): File "C:\Users\Give Up\AppData\Local\Programs\Python\Python310\lib\site-packages\flask\app.py", line 2548, in __call__ return self.wsgi_app(environ, start_response) File "C:\Users\Give Up\AppData\Local\Programs\Python\Python310\lib\site-packages\flask\app.py", line 2528, in wsgi_app response = self.handle_exception(e) File "C:\Users\Give Up\AppData\Local\Programs\Python\Python310\lib\site-packages\flask\app.py", line 2525, in wsgi_app response = self.full_dispatch_request() File "C:\Users\Give Up\AppData\Local\Programs\Python\Python310\lib\site-packages\flask\app.py", line 1822, in full_dispatch_request rv = self.handle_user_exception(e) File "C:\Users\Give Up\AppData\Local\Programs\Python\Python310\lib\site-packages\flask\app.py", line 1820, in full_dispatch_request rv = self.dispatch_request() File "C:\Users\Give Up\AppData\Local\Programs\Python\Python310\lib\site-packages\flask\app.py", line 1796, in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) File "g:\Documents\onedrive\OneDrive - MSFT\Huzaifa\CODE\TESST\asdasdasdasd\app.py", line 25, in index test=model_form(Test1()) File "C:\Users\Give Up\AppData\Local\Programs\Python\Python310\lib\site-packages\flask_mongoengine\wtf\orm.py", line 306, in model_form return type(model.__name__ + "Form", (base_class,), field_dict) AttributeError: 'Test1' object has no attribute '__name__'
问题原因
- 核心错误:
model_form函数需要接收Mongo Document的类本身作为参数,但代码中传入的是Test1()(类的实例对象)。实例对象没有__name__属性,导致抛出AttributeError。 - 语法问题:
Test1类中的字段定义没有缩进,不符合Python语法,会导致字段未被正确绑定到类上。 - 拼写错误:模板文件名写成了
inedx.html,应为index.html,会导致模板找不到。
解决方案
修正后的完整代码
from flask_mongoengine.wtf import model_form from flask_mongoengine import MongoEngine from flask import render_template, request, Flask app = Flask(__name__) db = MongoEngine() app.config['MONGODB_SETTINGS'] = {'db': 'project_database', 'host': 'localhost', 'port': 27017, 'alias': 'default'} db.init_app(app) class Test1(db.Document): # 给字段添加正确缩进 in1 = db.StringField() in2 = db.StringField() in3 = db.StringField() @app.route('/', methods=['GET', 'POST']) def index(): # 传入Test1类而非实例 Test1Form = model_form(Test1) # 生成表单实例供模板使用 form = Test1Form() # 修正模板文件名拼写 return render_template('index.html', test=form) app.run(debug=True)
关键修改点
- 将
model_form(Test1())改为model_form(Test1),传入类本身而非实例 - 为
Test1类的字段添加正确缩进,确保字段属于类属性 - 修正模板文件名拼写错误,从
inedx.html改为index.html - 额外补充:
model_form返回的是表单类,需要实例化后再传入模板,这样模板中才能正常渲染表单控件
内容的提问来源于stack exchange,提问作者huzaifa saad
相关产品推荐
相关产品推荐

