我使用了內置驗證器,但它們都沒有在頁面上列印訊息。另外,我想創建一個自定義驗證器來檢查重復的用戶名。函式我已經寫好了,因為我是初學者,不知道怎么用。請解決問題。
from flask import Flask, app, render_template, request, url_for
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField, PasswordField
from wtforms.validators import InputRequired, EqualTo, ValidationError
app = Flask(__name__)
app.config['SECRET_KEY'] = "PQrs12t46uvvrty567"
class MyForm(FlaskForm):
username = StringField('Username', validators=[InputRequired(message="This field is required.")])
password=PasswordField('Password', validators=[InputRequired(message=("enter the password"))])
confirm_password=PasswordField('Confirm Password', validators=[EqualTo('password')])
submit = SubmitField('Register')
def isDuplicate():
appdatabase={"Alis":"Smith","Mike":"Brown","Paul":"Miller"}
form = MyForm()
for user in appdatabase:
if form.username == appdatabase[user]:
raise ValidationError("Username already exists! Please choose another one.")
@app.route('/')
def base():
form = MyForm()
return render_template('customvalidator.html', form = form)
@app.route('/submitform', methods=["GET","POST"])
def submitform():
form = MyForm()
if form.validate_on_submit():
return 'Form accepted successfully.'
else:
return 'Incorrect form data'
if __name__=="__main__":
app.run(debug=True)
HTML檔案
<!DOCTYPE html>
<html>
<head><title>My website</title></head>
<body>
<h1>Registration form</h1>
<form action="{{ url_for('submitform') }}" method="post">
{{ form.csrf_token }}
{{ form.username.label }}
{{ form.username }}
<ul>
{% for error in form.username.errors %}
<li style="color: red;">{{ error }} </li>
{% endfor %}
</ul>
<br>
{{ form.password.label }}
{{ form.password }} <br><br>
{{ form.confirm_password.label }}
{{ form.confirm_password }} <br><br>
{{ form.submit}}
</form>
</body>
</html>
uj5u.com熱心網友回復:
嘗試將isDuplicate函式更改為:
def isDuplicate(form, field):
appdatabase={"Alis":"Smith","Mike":"Brown","Paul":"Miller"}
form = MyForm()
for user in appdatabase:
if form.username.data == appdatabase[user]:
raise ValidationError("Username already exists! Please choose another one.")
請注意向函式添加的表單和欄位引數,以允許將其用作自定義驗證器。form.username也改為form.username.data訪問用戶名欄位的資料。(整個函式需要在表單之前定義。)
然后,您需要將此自定義驗證器添加到表單中用戶名欄位的驗證器串列中,如下所示:
username = StringField('Username', validators=[InputRequired(message="This field is required."),isDuplicate])
通過這些更改,自定義驗證應該可以作業,但我們仍然沒有解決自定義錯誤訊息的問題。為此,請novalidate向 HTML 表單標記添加一個屬性。添加這將禁用表單上的默認驗證并允許您顯示自定義訊息。
有了它,我相信由于您處理表單提交的方式,這些訊息仍然不起作用。當表單未通過驗證時,您將希望顯示相同的表單模板,而不是顯示它們是否已提交。
我個人的意見是合并你的兩個表單路由將是最簡單的選擇。有一個路由定義表單,檢查它何時被驗證,然后呈現表單模板。這將使您能夠將所有內容保持在一起,并且當您只想顯示帶有一些添加的錯誤訊息的相同模板時,不會呈現不同的模板。
學分:
- 自定義驗證器(檢查最后一點)
- 關于顯示驗證訊息的 SO 問題
- 哪位導致我這一個上實際如何禁用默認的訊息。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/365943.html
