希望你一切都好。
我在向数据库添加数据时遇到问题,当您作为用户尝试提交表单时,它使用 method = "POST" 发送它,效果很好,但是当它尝试使用表单验证它时,它不会工作。
这是我的html表单代码:
<form method="POST" action="/contacto">
<input name="name" type="text" class="feedback-input" placeholder="Nombre" />
<input name="email" type="text" class="feedback-input" placeholder="Email" />
<input name="phone_number" type="text" class="feedback-input" placeholder="Teléfono" />
<textarea name="message" class="feedback-input" placeholder="Mensaje"></textarea>
<input type="submit" value="Enviar"/>
<div class="check_aviso">
</div>
</form>
这是我的routes.py代码:
@app.route('/contacto', methods=['GET', 'POST'])
def contacto():
form = ContactInfoForm(request.form)
context = {
'form': form,
}
if request.method == 'POST':
print("information sent via post")
context['go_to_form'] = True
if form.validate():
print("also validated")
name = form.name.data
print(name)
email = form.email.data
phone_number = form.phone_number.data
message = form.message.data
user_info = ContactInfo(name=name, email=email, phone_number=phone_number, message=message)
db.session.add(user_info)
db.session.commit()
send_contact_info_email(name, email, phone_number, message)
flash(
'Muchas gracias por la información, en la brevedad '
+ 'nos pondremos en contacto con usted.','success'
)
return redirect(
url_for('contacto', _anchor='form')
)
else:
flash('Data not saved','error')
return render_template('contacto.html', **context)
return render_template('contacto.html', **context)
这是我的forms.py:
class ContactInfoForm(FlaskForm):
name = StringField('Nombre')
email = StringField('Correo electrónico', validators=[Email()])
phone_number = StringField('Número de teléfono')
message = StringField('Mensaje')
这是我的模型.py:
class ContactInfo(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String, nullable=False)
email = db.Column(db.String, nullable=True)
phone_number = db.Column(db.String, nullable=True)
message = db.Column(db.String, nullable=True)
contact_date = db.Column(
db.DateTime, nullable=False, server_default=db.func.now()
)
数据未经验证,因此未添加/保存到数据库中。
我假设没有发送 CSRF 令牌,这就是验证失败的原因。
以下示例添加带有标记的隐藏字段。此外,在验证过程中会显示错误,这简化了用户的调试和处理。
from flask import (
Flask,
flash,
redirect,
render_template,
request,
url_for
)
from flask_sqlalchemy import SQLAlchemy
from flask_wtf import FlaskForm
from wtforms import StringField
from wtforms.validators import Email
from wtforms.widgets import TextArea
app = Flask(__name__)
app.config.from_mapping(
SECRET_KEY='Your secret here!',
SQLALCHEMY_DATABASE_URI='sqlite:///demo.db'
)
db = SQLAlchemy(app)
class ContactInfo(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String, nullable=False)
email = db.Column(db.String, nullable=True)
phone_number = db.Column(db.String, nullable=True)
message = db.Column(db.String, nullable=True)
contact_date = db.Column(db.DateTime, nullable=False, server_default=db.func.now())
class ContactInfoForm(FlaskForm):
name = StringField(
'Nombre',
render_kw={ 'placeholder': 'Nombre', }
)
email = StringField(
'Correo electrónico',
validators=[Email()],
render_kw={ 'placeholder': 'Email', }
)
phone_number = StringField(
'Número de teléfono',
render_kw={ 'placeholder': 'Teléfono', }
)
message = StringField(
'Mensaje',
widget=TextArea(),
render_kw={ 'placeholder': 'Mensaje', }
)
with app.app_context():
db.drop_all()
db.create_all()
@app.route('/contacto', methods=['GET', 'POST'])
def contact():
form = ContactInfoForm(request.form)
if form.validate_on_submit():
contact_info = ContactInfo()
form.populate_obj(contact_info)
db.session.add(contact_info)
db.session.commit()
# ...
flash(
'Muchas gracias por la información, en la brevedad '\
'nos pondremos en contacto con usted.','success'
)
return redirect(url_for('.contact', _anchor='form'))
return render_template('contact.html', **locals())
<form method="POST">
{{ form.csrf_token }}
<div>
{{ form.name.label() }}
{{ form.name(class_='feedback-input') }}
{% if form.name.errors -%}
<ul>
{% for error in form.name.errors -%}
<li>{{ error }}</li>
{% endfor -%}
</ul>
{% endif -%}
</div>
<div>
{{ form.email.label() }}
{{ form.email(class_='feedback-input') }}
{% if form.email.errors -%}
<ul>
{% for error in form.email.errors -%}
<li>{{ error }}</li>
{% endfor -%}
</ul>
{% endif -%}
</div>
<div>
{{ form.phone_number.label() }}
{{ form.phone_number(class_='feedback-input') }}
{% if form.phone_number.errors -%}
<ul>
{% for error in form.phone_number.errors -%}
<li>{{ error }}</li>
{% endfor -%}
</ul>
{% endif -%}
</div>
<div>
{{ form.message.label() }}
{{ form.message(class_='feedback-input') }}
{% if form.message.errors -%}
<ul>
{% for error in form.message.errors -%}
<li>{{ error }}</li>
{% endfor -%}
</ul>
{% endif -%}
</div>
<button type="submit">Enviar</button>
</form>