Flask 炼金术对象没有属性

Flask 炼金术对象没有属性,flask,flask-sqlalchemy,flask-wtforms,flask-login,flask-restful,Flask,Flask Sqlalchemy,Flask Wtforms,Flask Login,Flask Restful,我刚开始使用flask restful api,并试图通过向localhost:5000/api/v1/users发送POST请求来注册用户。必填字段为电子邮件和密码。下面是创建用户curl的curl请求http://localhost:5000/api/v1/users -d“电子邮件=admin@example.com&密码=密码“-X POST-v 但它会返回以下错误:AttributeError:'UserCreateForm'对象没有属性“password” 下面是我的一些代码片段 v

我刚开始使用flask restful api,并试图通过向
localhost:5000/api/v1/users
发送POST请求来注册用户。必填字段为电子邮件和密码。下面是创建用户
curl的curl请求http://localhost:5000/api/v1/users -d“电子邮件=admin@example.com&密码=密码“-X POST-v

但它会返回以下错误:
AttributeError:'UserCreateForm'对象没有属性“password”

下面是我的一些代码片段

views.py

class UserView(restful.Resource):
    def post(self):
        form = UserCreateForm()
        if not form.validate_on_submit():
            return form.errors, 422

        user = User(email=form.email.data, password=form.password.data)
        db.session.add(user)
        db.session.commit()
        return UserSerializer(user).data
forms.py

BaseModelForm = model_form_factory(Form)

class ModelForm(BaseModelForm):
    @classmethod
    def get_session(self):
        return db.session

class UserCreateForm(ModelForm):
    class Meta:
        model = User
models.py(我厌倦了将
UserMixin
放在第二位,仍然得到相同的错误)

另外,我还有
login\u manager.user\u loader
,所以我认为flask登录不会有问题


有关于WTU炼金术的文档吗?我完全不知道如何从模型中自动创建表单。

UserCreateForm
将从您在
User
上定义的列继承其字段
User
没有名为
password
的列,因此
UserCreateForm
没有这样的字段。您必须自己添加该字段

from wtforms.fields import PasswordField

class UserCreateForm(ModelForm):
    class Meta:
        model = User

    password = PasswordField()

讨论添加和覆盖字段。

如果我想要不同的名称,例如数据库列中的
fname
,并且我想要将字段
firstname
添加到表单中,该怎么办。如果我执行
firstname=TextField()
操作,则此字段中的值是否会传递到数据库中的
fname
列?除非您告诉它。只有在名称匹配时,WTForms炼金术才能建立连接。如果您需要进行任何自定义映射,您需要自己将其包括在内。理想情况下,您不会在模型中给它一个名称,在表单中给它另一个名称。但是对于密码,您可以实现自己的
populate_obj
并包括
obj.password=self.password.data
或类似的内容。密码现在可以使用了,但我很好奇如何使用。表单字段中有
password
,但在db列中是
password\u hash
,并且没有您提到的映射。这是因为
User
有一个名为
password
的属性(但不是
)。如果没有,您需要添加一些内容来为
password\u hash
赋值。很难在评论中回答问题。如果你原来的问题已经解决了,请考虑接受这个答案,并提出一个新的问题,以允许正确的答案。
from wtforms.fields import PasswordField

class UserCreateForm(ModelForm):
    class Meta:
        model = User

    password = PasswordField()