Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用jinja2在WTForm中引发错误_Python_Html_Flask_Jinja2_Wtforms - Fatal编程技术网

Python 使用jinja2在WTForm中引发错误

Python 使用jinja2在WTForm中引发错误,python,html,flask,jinja2,wtforms,Python,Html,Flask,Jinja2,Wtforms,我试图在Jinja2中引发一个错误,在WTForm中,如果url输入未经验证,则应引发该错误,但当我提交无效url时,会出现一个弹出窗口,显示“请输入url” 如何传递默认弹出窗口并添加自定义错误消息 以下是主要的问题: from datetime import datetime from flask import Flask, render_template, url_for, request, redirect,flash from logging import DEBUG from fla

我试图在Jinja2中引发一个错误,在WTForm中,如果url输入未经验证,则应引发该错误,但当我提交无效url时,会出现一个弹出窗口,显示“请输入url”

如何传递默认弹出窗口并添加自定义错误消息

以下是主要的问题:

from datetime import datetime
from flask import Flask, render_template, url_for, request, redirect,flash
from logging import DEBUG
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField
from flask.ext.wtf.html5 import URLField
from wtforms.validators import DataRequired , url


app = Flask(__name__)
app.logger.setLevel(DEBUG)
app.config['SECRET_KEY']='{@\x8d\x90\xbf\x89n\x06%`I\xfa(d\xc2\x0e\xfa\xb7>\x81?\x86\x7f\x1e'


@app.route('/')
@app.route('/index')

def index():
    return render_template('base.html')

@app.route('/add', methods=['GET','POST'])
def add():
    return render_template('add.html')


# HERE IS THE LOGIN FORM
class Login(FlaskForm):
    username = StringField('username')
    password = PasswordField('password')
    url = URLField('url', validators=[DataRequired(),url()])

@app.route('/form', methods=['GET','POST'])
def form():
    form = Login()
    if form.validate_on_submit():
        url = form.url.data
        return redirect(url_for('index'))
    return render_template('form.html',form = form )


if __name__ =='__main__':
    app.run(debug=True)
以下是模板:

  <!DOCTYPE html>
<html>
<head>
    <title>form</title>
</head>
<body>
 <h1>Hello !</h1>
 <form method="POST" action="{{url_for('form')}}">
 {{ form.hidden_tag() }}
 {{ form.csrf_token }}
 {{ form.username.label }}
 {{ form.username }}
 {{ form.password.label }}
 {{ form.password }}
 {{ form.url.label }}
 {{ form.url }}
  {% if form.url.errors %} <p> {{error}}</p> {% endif %}
 <button type="submit">Submit</button>
 </form>
</body>
</html>

类型
你好
{{form.hidden_tag()}}
{{form.csrf_token}
{{form.username.label}
{{form.username}
{{form.password.label}
{{form.password}}
{{form.url.label}
{{form.url}}
{%if-form.url.errors%}{{error}

{%endif%} 提交
因为您使用的是数据类型
URLField
,所以它被呈现为HTML5“url”表单字段类型

您的浏览器会识别这一点,并对提交的数据执行自己的验证:

您无法覆盖此选项-它内置于浏览器中


如果需要显示自定义错误消息,可以使用
文本字段
,并提供自己的URL验证逻辑。

在表单定义中添加自己的消息,而不是默认消息

url = URLField('url', validators=[DataRequired(),url(message="Please enter a valid url (e.g.-http://example.com/)")]) 

它似乎适合您的情况。

正如马特·希利之前提到的,是浏览器验证了
URLField
。 因此,如果需要自定义错误消息,请使用
StringField
TextField
已过时)。如果需要,可以使用自定义消息,如下所示
message='text to display'
。 例如:

当然,*.html应该包含向页面输出错误的代码:

                <ul>
                    {% for error in form.url.errors %}
                        <li>{{ error }}</li>
                    {% endfor %}
                </ul>
    {%form.url.errors%}
  • {{error}}
  • {%endfor%}

弹出窗口由浏览器呈现,因为
required
会自动附加到表单元素中。有两种方法可以覆盖此行为,如下所述:
                <ul>
                    {% for error in form.url.errors %}
                        <li>{{ error }}</li>
                    {% endfor %}
                </ul>