Flask WTF'StringField'对象没有属性'translate' [英] Flask WTF 'StringField' object has no attribute 'translate'

查看:108
本文介绍了Flask WTF'StringField'对象没有属性'translate'的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我对Python比较陌生,并且一直关注 Miguel Grinberg Flask Mega-Tutorial .

I am relatively new to Python, and I've been following the Miguel Grinberg Flask Mega-Tutorial.

我有一个非常简单的表格,当我尝试提交时,收到以下错误:

I have a very simple form which, when I try to submit, I receive the following error:

AttributeError:"StringField"对象没有属性"translate"

AttributeError: 'StringField' object has no attribute 'translate'

这是表格:

from flask.ext.wtf import Form
from wtforms import StringField
from wtforms.validators import DataRequired


class CreateSubjectForm(Form):
    name = StringField('name', validators=[DataRequired()])

views.py:

@app.route('/create_subject', methods=['GET', 'POST'])
def create_subject():
    form = CreateSubjectForm()
    if form.validate_on_submit():
        subject = Subject(name=form.name)
        db.session.add(subject)
        db.session.commit()
    return render_template('create_subject.html',
                           title='Create Subject',
                           form=form)

我的模板如下:

{% extends "base.html" %}

{% block content %}
    <h2>Create Subject</h2>
    <form action="" method="post" name="create_subject">
        {{ form.hidden_tag() }}
        <div class="form-control-label">Name: </div>
        <div class="form-control">{{ form.name(size=45) }}</div>
        <input type="submit" value="Create">
    </form>
{% endblock %}

我一直无法解决这个问题,但这就是我所看到的.

I have been unable to solve this problem, but here is what I have looked at.

一个令人担忧的事实是,PyCharm告诉我在from flask.ext.wtf import Form行的flask.ext中找不到wtf.我正在使用Python 2.7.从研究看来,这是导入2.7的正确方法.我尝试将其更改为from flask_wtf import Form,PyCharm错误消失了,但是行为是相同的.

One concern arose from the fact that PyCharm tells me that it cannot find wtf in flask.ext in the line from flask.ext.wtf import Form. I am using Python 2.7. From research it appears that this is the correct way to import for 2.7. I tried changing it to from flask_wtf import Form and the PyCharm error goes away, but the behaviour is the same.

从追溯开始,我认为版本和软件包似乎出了点问题.我仔细检查了是否已经安装了pip.install所安装的所有软件,并且看来可以了-这是虚拟环境中的pip.freeze:

From the traceback I thought it looked like something has gone wrong with versions and packages. I double check I had everything installed with pip.install and it appears I do - here is pip.freeze from the virtual environment:

Babel==2.2.0
blinker==1.4
coverage==4.0.3
decorator==4.0.9
Flask==0.10.1
Flask-Babel==0.9
Flask-Login==0.3.2
Flask-Mail==0.9.1
Flask-OpenID==1.2.5
Flask-SQLAlchemy==2.1
Flask-WhooshAlchemy==0.56
Flask-WTF==0.12
flipflop==1.0
guess-language==0.2
itsdangerous==0.24
Jinja2==2.8
MarkupSafe==0.23
pbr==1.8.1
PyMySQL==0.7.2
python-openid==2.2.5
pytz==2016.3
six==1.10.0
speaklater==1.3
SQLAlchemy==1.0.12
sqlalchemy-migrate==0.10.0
sqlparse==0.1.19
Tempita==0.5.2
Werkzeug==0.11.5
Whoosh==2.7.3
WTForms==2.1

这是回溯:

> Traceback (most recent call last):   File
> "C:\Users\timni\onedrive\dev\studyplanner\venv\lib\site-packages\flask\app.py",
> line 1836, in __call__
>     return self.wsgi_app(environ, start_response)   File "C:\Users\timni\onedrive\dev\studyplanner\venv\lib\site-packages\flask\app.py",
> line 1820, in wsgi_app
>     response = self.make_response(self.handle_exception(e))   File "C:\Users\timni\onedrive\dev\studyplanner\venv\lib\site-packages\flask\app.py",
> line 1403, in handle_exception
>     reraise(exc_type, exc_value, tb)   File "C:\Users\timni\onedrive\dev\studyplanner\venv\lib\site-packages\flask\app.py",
> line 1817, in wsgi_app
>     response = self.full_dispatch_request()   File "C:\Users\timni\onedrive\dev\studyplanner\venv\lib\site-packages\flask\app.py",
> line 1477, in full_dispatch_request
>     rv = self.handle_user_exception(e)   File "C:\Users\timni\onedrive\dev\studyplanner\venv\lib\site-packages\flask\app.py",
> line 1381, in handle_user_exception
>     reraise(exc_type, exc_value, tb)   File "C:\Users\timni\onedrive\dev\studyplanner\venv\lib\site-packages\flask\app.py",
> line 1475, in full_dispatch_request
>     rv = self.dispatch_request()   File "C:\Users\timni\onedrive\dev\studyplanner\venv\lib\site-packages\flask\app.py",
> line 1461, in dispatch_request
>     return self.view_functions[rule.endpoint](**req.view_args)   File "C:\Users\timni\onedrive\dev\studyplanner\app\views.py", line 24, in
> create_subject
>     db.session.commit()   File "C:\Users\timni\onedrive\dev\studyplanner\venv\lib\site-packages\sqlalchemy\orm\scoping.py",
> line 157, in do
>     return getattr(self.registry(), name)(*args, **kwargs)   File "C:\Users\timni\onedrive\dev\studyplanner\venv\lib\site-packages\sqlalchemy\orm\session.py",
> line 801, in commit
>     self.transaction.commit()   File "C:\Users\timni\onedrive\dev\studyplanner\venv\lib\site-packages\sqlalchemy\orm\session.py",
> line 392, in commit
>     self._prepare_impl()   File "C:\Users\timni\onedrive\dev\studyplanner\venv\lib\site-packages\sqlalchemy\orm\session.py",
> line 372, in _prepare_impl
>     self.session.flush()   File "C:\Users\timni\onedrive\dev\studyplanner\venv\lib\site-packages\sqlalchemy\orm\session.py",
> line 2019, in flush
>     self._flush(objects)   File "C:\Users\timni\onedrive\dev\studyplanner\venv\lib\site-packages\sqlalchemy\orm\session.py",
> line 2137, in _flush
>     transaction.rollback(_capture_exception=True)   File "C:\Users\timni\onedrive\dev\studyplanner\venv\lib\site-packages\sqlalchemy\util\langhelpers.py",
> line 60, in __exit__
>     compat.reraise(exc_type, exc_value, exc_tb)   File "C:\Users\timni\onedrive\dev\studyplanner\venv\lib\site-packages\sqlalchemy\orm\session.py",
> line 2101, in _flush
>     flush_context.execute()   File "C:\Users\timni\onedrive\dev\studyplanner\venv\lib\site-packages\sqlalchemy\orm\unitofwork.py",
> line 373, in execute
>     rec.execute(self)   File "C:\Users\timni\onedrive\dev\studyplanner\venv\lib\site-packages\sqlalchemy\orm\unitofwork.py",
> line 532, in execute
>     uow   File "C:\Users\timni\onedrive\dev\studyplanner\venv\lib\site-packages\sqlalchemy\orm\persistence.py",
> line 174, in save_obj
>     mapper, table, insert)   File "C:\Users\timni\onedrive\dev\studyplanner\venv\lib\site-packages\sqlalchemy\orm\persistence.py",
> line 800, in _emit_insert_statements
>     execute(statement, params)   File "C:\Users\timni\onedrive\dev\studyplanner\venv\lib\site-packages\sqlalchemy\engine\base.py",
> line 914, in execute
>     return meth(self, multiparams, params)   File "C:\Users\timni\onedrive\dev\studyplanner\venv\lib\site-packages\sqlalchemy\sql\elements.py",
> line 323, in _execute_on_connection
>     return connection._execute_clauseelement(self, multiparams, params)   File
> "C:\Users\timni\onedrive\dev\studyplanner\venv\lib\site-packages\sqlalchemy\engine\base.py",
> line 1010, in _execute_clauseelement
>     compiled_sql, distilled_params   File "C:\Users\timni\onedrive\dev\studyplanner\venv\lib\site-packages\sqlalchemy\engine\base.py",
> line 1146, in _execute_context
>     context)   File "C:\Users\timni\onedrive\dev\studyplanner\venv\lib\site-packages\sqlalchemy\engine\base.py",
> line 1344, in _handle_dbapi_exception
>     util.reraise(*exc_info)   File "C:\Users\timni\onedrive\dev\studyplanner\venv\lib\site-packages\sqlalchemy\engine\base.py",
> line 1139, in _execute_context
>     context)   File "C:\Users\timni\onedrive\dev\studyplanner\venv\lib\site-packages\sqlalchemy\engine\default.py",
> line 450, in do_execute
>     cursor.execute(statement, parameters)   File "C:\Users\timni\onedrive\dev\studyplanner\venv\lib\site-packages\pymysql\cursors.py",
> line 156, in execute
>     query = self.mogrify(query, args)   File "C:\Users\timni\onedrive\dev\studyplanner\venv\lib\site-packages\pymysql\cursors.py",
> line 135, in mogrify
>     query = query % self._escape_args(args, conn)   File "C:\Users\timni\onedrive\dev\studyplanner\venv\lib\site-packages\pymysql\cursors.py",
> line 115, in _escape_args
>     return dict((key, conn.escape(val)) for (key, val) in args.items())   File
> "C:\Users\timni\onedrive\dev\studyplanner\venv\lib\site-packages\pymysql\cursors.py",
> line 115, in <genexpr>
>     return dict((key, conn.escape(val)) for (key, val) in args.items())   File
> "C:\Users\timni\onedrive\dev\studyplanner\venv\lib\site-packages\pymysql\connections.py",
> line 781, in escape
>     return escape_item(obj, self.charset, mapping=mapping)   File "C:\Users\timni\onedrive\dev\studyplanner\venv\lib\site-packages\pymysql\converters.py",
> line 26, in escape_item
>     val = encoder(val, mapping)   File "C:\Users\timni\onedrive\dev\studyplanner\venv\lib\site-packages\pymysql\converters.py",
> line 109, in escape_unicode
>     return u"'%s'" % _escape_unicode(value)   File "C:\Users\timni\onedrive\dev\studyplanner\venv\lib\site-packages\pymysql\converters.py",
> line 72, in _escape_unicode
>     return value.translate(_escape_table) AttributeError: 'StringField' object has no attribute 'translate'

所以在这一点上我很沮丧.任何帮助将不胜感激.谢谢.

So at this point I am stumped. Any help will be very greatly appreciated. Thank you.

推荐答案

发生错误是因为Subject实例是用StringField实例构造的,但所需的StringField数据中的em>.

The error is occurring because the Subject instance is being constructed with an instance of StringField, but what is required is the value of the StringField's data.

所以不是

subject = Subject(name=form.name)  # form.name is a StringField

subject = Subject(name=form.name.data) 

提示消息中的线索是AttributeError: 'StringField' object has no attribute 'translate'-translate是字符串方法,因此它表明将某个不是string的东西传递给了一个需要string的东西.

The clue is in the exception message AttributeError: 'StringField' object has no attribute 'translate' - translate is a string method, so it suggests that somewhere something that is not a string is being passed to something that expects a string.

这篇关于Flask WTF'StringField'对象没有属性'translate'的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆