我想使用从路由传入的默认值来执行查询选择字段.我无法弄清楚如何将视图中的变量传递给Form类
class transactionsForm(Form):
loan_id = QuerySelectField('trans_id', validators=[Required()], get_label='name',
query_factory=lambda: trans.query.filter_by(trans_id=[MY VARIABLE]).all())
Run Code Online (Sandbox Code Playgroud) 我通过flask-WTF 扩展使用WTForms。我想在提交后更改日期字段的值。下面是一个例子:
class ExampleForm1(Form):
date1 = DateField('Date', description = 'Select date..')
submit_button = SubmitField('OK')
@app.route("/exampleform1", methods=['GET', 'POST'])
def example1():
form = ExampleForm1()
if request.method == 'POST' and form.validate():
print str(form.date1)
print form.date1.data
form.date1.process_data(date(2000, 01, 01))
print str(form.date1)
print form.date1.data
return render_template('example1.html', form=form)
form.date1.process_data(date.today())
return render_template('example1.html', form=form)
Run Code Online (Sandbox Code Playgroud)
这是输出:
<input id="date1" name="date1" type="date" value="2015-03-15">
2015-03-15
<input id="date1" name="date1" type="date" value="2015-03-15"> <-- This isn't updated
2000-01-01 <-- this is updated
Run Code Online (Sandbox Code Playgroud)
该网页仍显示 2015-03-15 而不是 2000-01-01。我错过了什么?
谢谢!
如果字段标签为“登录”,则我不想仅显示输入本身。但是field.label,将宏中的“登录”与“登录”进行比较始终是错误的,因为<p>hello</p>永远不会呈现。如何将标签与字符串进行比较?
{% macro render_field(field) %}
{%if field.label == "Log-in" %}
<p>hello</p>
{%else%}
{{ field.label }} {{ field(**kwargs)|safe }}
{%endif%}
{% endmacro %}
<div id = "SignUpForm">
<form action = "" method = "post" name = "SignUpForm">
<p>{{render_field(form.username)}}</p>
<p>{{render_field(form.first_name)}}</p>
<p>{{render_field(form.last_name)}}</p>
<p>{{render_field(form.password)}}</p>
<p>{{render_field(form.password2)}}</p>
<p>{{form.submit}}</p>
{{form.hidden_tag()}}
</form>
</div>
Run Code Online (Sandbox Code Playgroud) 我正在尝试构建一个python flask应用程序,但是当我尝试将表单数据提交给python方法时,我遇到了一个问题.
服务器抛出的问题是"Method Not Allowed".
HTML代码
<h1>Submit the Link</h1>
<form action="/submit_article" method="POST" name="form">
<div class="col-md-4 col-md-offset-4">
{{ form.hidden_tag() }}
<div class="form-group">
<label class="control-label" for="description">Name</label>
{{ form.description }}
</div>
<div class="form-group">
<label class="control-label" for="link">Link</label>
{{ form.link }}
</div>
<button class="btn btn-default" type="submit">Submit</button>
</div>
</form>
Run Code Online (Sandbox Code Playgroud)
PYTHON方法(submit_article)
@app.route('/submit_article', methods=['POST'])
def submit_article():
form = UploadForm()
if request.method == 'POST':
data = {
"_id": form.link.data,
"description": form.description.data,
"user": current_user.username,
"time": datetime.datetime.now()
}
try:
if((app.config['NEWS_COLLECTION'].insert(data))):
flash("Link added successfully", category="success")
return redirect(request.args.get("new") or url_for("new"))
except DuplicateKeyError:
flash("Article …Run Code Online (Sandbox Code Playgroud) 我想要做的是检查表单对象具有哪种类型的表单验证器,以便我可以基于这些属性呈现字段.例如,如果表单具有最大长度验证,则将max-length属性添加到html表单.
我在想它的工作方式是这样的:
zip_code = TextField('Zip Code', [validators.Length(min=5, max=11)])
Run Code Online (Sandbox Code Playgroud)
将会像这样进入Jinja2宏:
{% if field.valdator "has max length" %}
{% set class = class + ' maxlength="11" ' %}
{% endif %}
{{ field(class=class, **kwargs) }}
Run Code Online (Sandbox Code Playgroud) 我有以下 Flask-WTF 表格:
class PersonForm(FlaskForm):
name = StringField('Name', validators=[DataRequired()])
age = IntegerField('Age', validators=[NumberRange(min=0)], render_kw={'type': 'number'})
educated = BooleanField('Educated', render_kw={'type': 'checkbox'})
Run Code Online (Sandbox Code Playgroud)
我知道我可以通过将值传递到表单中来预先填充表单,如下所示:
form = PersonForm(name='Johnny', age=25, educated=True)
Run Code Online (Sandbox Code Playgroud)
我注意到有一种更好的方法可以通过将一个对象注入到表单中来做到这一点(参考这里和这里)。我已经尝试了以下方法,但是,它不起作用。我哪里出错了(对象应该是字典以外的东西)?
person = {'name': 'Johnny', 'age': 25, 'educated'=True}
form = PersonForm(obj=person)
Run Code Online (Sandbox Code Playgroud)
请注意,这些预先填充的值来自数据库。有些值已定义,有些则未定义。例如,另一个“人”可能看起来像{'name': 'Jessica', 'educated': True}(在这种情况下,年龄字段将为空)。
I have some Flask-SQLAlchemy models and Flask-WTF forms generated with wtforms_alchemy to represent them. I implemented a method on each model to update its attributes from a form's data. For each new model and field I have to update these methods, which is annoying. Is there a way to make this more automatic, or a a feature in the libraries I'm using that I'm missing?
def edit_car(car_id):
form = CarForm(request.form)
if form.is_valid():
car = Car.query.get_or_404(car_id)
car.from_form(form) # Update car fields …Run Code Online (Sandbox Code Playgroud) 我无法在其他字段中上传图像。虽然其他字段的数据存在,但图像不存在,因此表单没有被验证。
这里是后端,具体看图片文件字段,标有#IMAGE
from flask import Blueprint, request, render_template, redirect, flash
import os
from flask import current_app as app
from src.models.products.product import Product
from flask_wtf import FlaskForm
from wtforms import StringField, BooleanField, FileField, SubmitField
from wtforms.validators import InputRequired
from flask_wtf.file import FileField, FileRequired
from werkzeug.utils import secure_filename
dash_board_blueprint = Blueprint('dashboard', __name__, template_folder='templates')
class UploadForm(FlaskForm):
name = StringField('Name', validators=[InputRequired()])
category = StringField('Category', validators=[InputRequired()])
sub_category = StringField('Sub Category', validators=[InputRequired()])
size = StringField('Size', validators=[InputRequired()])
variant = StringField('Variant', validators=[InputRequired()])
price = StringField('Price', validators=[InputRequired()])
enable_discount = …Run Code Online (Sandbox Code Playgroud) 我无法弄清楚为什么我的表单无法验证。我已经确保将 CSRF 字段插入到 HTML 中form.hidden_tag
这是我的注册表单的代码:
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField, BooleanField
from wtforms.validators import DataRequired, Length, Email, EqualTo
class RegistrationForm(FlaskForm):
username = StringField('Username', validators=[DataRequired(), Length(min=2, max=20)])
email = StringField('Email', validators=[DataRequired(), Email()])
password = PasswordField('Password', validators=[DataRequired()])
confirm_password = PasswordField('Confirm Password', validators=[DataRequired(), EqualTo(password)])
submit = SubmitField('Register')
Run Code Online (Sandbox Code Playgroud)
这是我正在检查表单是否经过验证的函数。它确实提交,因为程序将“已提交”打印到我的终端中
@app.route('/register', methods=['GET', 'POST'])
def register():
form = RegistrationForm()
if form.is_submitted():
print("submitted")
if form.validate_on_submit():
flash(f'Account created for {form.username.data}!', 'success')
return redirect(url_for('home'))
print(forms.errors)
return render_template('register.html', title='Register', form=form)
Run Code Online (Sandbox Code Playgroud)
使用forms.errors,我收到以下错误消息: …
因此,当我谈到在注册帐户时检查用户名或电子邮件是否已被使用时,我正在关注 Corey Schafer 的 Flask 教程。我一生都无法理解这段代码是如何工作的,我想这是因为我是 Python 和 Flask 的新手,但它仍然不应该如此令人困惑。
class RegistrationForm(FlaskForm):
username = StringField('Username', validators=[DataRequired(), Length(min=4,
max=20)])
email = StringField('Email', validators=[DataRequired(), Email()])
password = PasswordField('Password', validators=[DataRequired()])
password_confirm = PasswordField('Confirm password', validators=[DataRequired(),EqualTo('password')])
submit = SubmitField('Sign Up')
def validate_username(self, username):
user = User.query.filter_by(username=username.data).first()
if user:
raise ValidationError('That username is taken. Please choose
another.')
def validate_email(self, email):
user = User.query.filter_by(email=email.data).first()
if user:
raise ValidationError('That email is taken. Please choose another.')
Run Code Online (Sandbox Code Playgroud)
那么,我不明白的具体部分是RegistrationForm类中的两个函数:首先,这两个函数如何知道用户名和电子邮件是什么?例如,如果我将函数定义中的“用户名”和“电子邮件”参数更改为“u_n”和“e_mail”之类的内容,然后使用“u_n.data”和“e_mail.data”运行查询,则代码仍然有效. 其次,如果我要将函数重命名为其他任何内容,代码将停止工作,我不明白为什么?
我知道这个问题的答案不能太复杂,但这让我非常恼火。任何帮助将不胜感激。