15

我正在尝试使用烧瓶创建联系表单,但在呈现页面时不断收到此错误。

'forms.ContactForm object' has no attribute 'hidden_tag'

这是我的文件:

联系人.html

{% extends "layout.html" %}

{% block content %}
  <h2>Contact</h2>
  <form action="{{ url_for('contact') }}" method=post>
    {{ form.hidden_tag() }}

    {{ form.name.label }}
    {{ form.name }}

    {{ form.email.label }}
    {{ form.email }}

    {{ form.subject.label }}
    {{ form.subject }}

    {{ form.message.label }}
    {{ form.message }}

    {{ form.submit }}
  </form>
{% endblock %} 

表格.py

from flask.ext.wtf import Form
from wtforms import Form, TextField, TextAreaField, SubmitField, validators

class ContactForm(Form):
  name = TextField("Name", [validators.Required()])
  email = TextField("Email",[validators.Required(), validators.email()])
  subject = TextField("Subject", [validators.Required()])
  message = TextAreaField("Message", [validators.Required()])
  submit = SubmitField("Send")

路线.py

from flask import Flask, render_template, request
from forms import ContactForm

app = Flask(__name__)
app.secret_key = 'development key'

@app.route('/')
def home():
  return render_template('home.html')

@app.route('/about')
def about():
  return render_template('about.html')

@app.route('/contact', methods=['GET', 'POST'])
def contact():
  form = ContactForm()

if request.method == 'POST':
  return 'Form posted.'

elif request.method == 'GET':
  return render_template('contact.html', form=form)

if __name__ == '__main__':
  app.run(debug=True)

所有其他页面模板都运行良好。任何建议都会很棒!谢谢您的帮助!

4

4 回答 4

48

我也刚刚解决了这个问题。

您的问题是您两次导入 Form ,使您的 flask-wtfForm导入无用。

from flask_wtf import Form
from wtforms import Form, TextField, TextAreaField, SubmitField, validators
#                   ^^^ Remove

只有 flask-wtf 扩展具有Form可以自动处理 CSRF / 其他东西的特殊类。

于 2013-12-13T22:34:23.163 回答
3
我也试图解决这个问题。删除隐藏标签后附加的括号“()”后,它可以工作。

{{ form.hidden_tag }}

于 2015-05-05T10:12:47.390 回答
3

我花了一些时间来解决这个问题。

首先导入表单、字段、引导程序为:

from flask_wtf import Form
from wtforms import StringField #etc
from flask_bootstrap import Bootstrap

配置密钥和引导程序

app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret key'
Bootstrap(app)

像以前一样创建表单:

class ContactForm(Form):
  name = TextField("Name", [validators.Required()])
  email = TextField("Email",[validators.Required(), validators.email()])
  subject = TextField("Subject", [validators.Required()])
  message = TextAreaField("Message", [validators.Required()])
  submit = SubmitField("Send")

路由也没什么特别的,正常返回即可。

在 html 中:

{% extends "bootstrap/base.html" %}
{% import "bootstrap/wtf.html" as wtf %}
    {% if form %}
        {{ wtf.quick_form(form, ) }}
    {% endif %}

就是这样。希望您发现其中的一些(或全部)有用。

于 2016-08-03T14:59:59.207 回答
-2

您看到的错误是告诉您forms.ContactForm没有名为“hidden_​​tag”的方法。您在第 6 行引用该方法,contact.html如下所示:

{{ form.hidden_tag() }}

根据烧瓶文档,是实现CSRF 保护的正确方法。

我将首先删除引用“form.hidden_​​tag()”的行,然后查看您的表单是否有效。然后根据文档中的说明返回并实施 CSRF 保护。

于 2013-10-27T00:44:11.033 回答