以 python 形式使用 uk-postcode-utils

Posted

技术标签:

【中文标题】以 python 形式使用 uk-postcode-utils【英文标题】:Using uk-postcode-utils in a python form 【发布时间】:2019-03-07 13:23:00 【问题描述】:

我正在为用户创建一个表单以输入有效的英国邮政编码。我目前有以下表单代码:

class RegisterForm(Form):
    first_name = StringField('First Name', validators=[DataRequired(), validators.Length(min=1, max=50)])
    last_name = StringField('Last Name', validators=[DataRequired(), validators.Length(min=1, max=50)])
    centre_id = StringField('Centre ID', validators=[DataRequired(), validators.Length(min=1, max=11)])
    doctor_id = StringField('Doctor ID', validators=[DataRequired(), validators.Length(min=1, max=11)])
    address = StringField('Address Line 1', validators=[DataRequired(), validators.Length(min=1, max=100)])
    town_name = StringField('Town Name', validators=[DataRequired(), validators.Length(min=1, max=50)])
    county_name = SelectField('County Name', choices=[('antrim', 'Antrim'), ('armagh', 'Armagh'), ('down', 'Down'), ('derry/londonderry', 'Derry/Londonderry'), ('fermanagh', 'Fermanagh'), ('tyrone', 'Tyrone')], validators=[DataRequired()])
    postcode = StringField('Postcode', validators=[DataRequired(), validation.is_valid_postcode])
    telephone_number = TelField('Telephone Number', validators=[DataRequired(), validators.Length(min=11, max=11)])
    email_address = EmailField('Email Address', validators=[DataRequired()])
    patient_username = StringField('Username', validators.DataRequired(), validators.EqualTo('confirm_patient_username', message='Usernames do not match'))
    confirm_patient_username = StringField('Confirm Username')
    patient_password = PasswordField('Password', validators.DataRequired(),validators.EqualTo('confirm_patient_password', message='Passwords do not match'))
    confirm_patient_password = PasswordField('Confirm Password')

模板是:

% extends 'patient/patient_login_layout.html' %

% block body %
    <h1>Patient Register</h1>
    % from 'includes/_formhelpers.html' import render_field %
    <form method="POST" action="">
        <div class="form-group">
            render_field(form.first_name, class="form-control")
        </div>
        <div class="form-group">
            render_field(form.last_name, class="form-control")
        </div>
        <div class="form-group">
            render_field(form.centre_id, class="form-control")
        </div>
        <div class="form-group">
            render_field(form.doctor_id, class="form-control")
        </div>
        <div class="form-group">
            render_field(form.address, class="form-control")
        </div>
        <div class="form-group">
            render_field(form.town_name, class="form-control")
        </div>
        <div class="form-group">
            render_field(form.county_name, class="form-control")
        </div>
        <div class="form-group">
            render_field(form.postcode, class="form-control")
        </div>
        <div class="form-group">
            render_field(form.telephone_number, class="form-control")
        </div>
        <div class="form-group">
            render_field(form.email_address, class="form-control")
        </div>
        <div class="form-group">
            render_field(form.patient_username, class="form-control")
        </div>
        <div class="form-group">
            render_field(form.confirm_patient_username, class="form-control")
        </div>
        <div class="form-group">
            render_field(form.patient_password, class="form-control")
        </div>
        <div class="form-group">
            render_field(form.confirm_patient_password, class="form-control")
        </div>
        <p><input type="submit" class="btn btn-primary" value="Submit"></p>
    </form>
% endblock %

但收到错误:TypeError: 'StringField' 类型的参数不可迭代。

我能做些什么来解决这个问题?

编辑: 这是完整的表单条目和网页模板。 非常感谢。

【问题讨论】:

执行此行会导致TypeError? @Julia 是的,TypeError:'StringField' 类型的参数不可迭代 能否提供完整的表格和模板代码? @Julia 更改了那里的问题以包含更多细节 我已将上面的 StringField 插入我正在构建的烧瓶应用程序中,并且没有任何问题表明错误存在于其他地方,例如您的 views.py。您的堆栈是否显示导致问题的代码行...正如 Julia 所说,需要更多详细信息。 【参考方案1】:

您没有在 postcode StringField 中正确使用 WTForms 验证器。

声明一个接受表单和字段参数的函数,如果邮政编码无效,则引发错误,在此函数中您使用 uk-postcode-utils is_valid_postcode 函数,即:

from wtforms.validators import ValidationError
from ukpostcodeutils import validation

def post_code_validator(form, field):
    if not validation.is_valid_postcode(field.data):
        raise ValidationError('Invalid UK Post Code')

在 StringField 上注册验证器:

class RegisterForm(Form):
    #  ...
    postcode = StringField('Postcode', validators=[DataRequired(), post_code_validator])
    # ...

如果在多个表单中使用邮政编码字段,您最好编写一个类验证器,如 WTForms documentation 中所述。

类似的东西(未经测试):

from wtforms.validators import ValidationError
from ukpostcodeutils import validation

class PostCodeValidator(object):
    def __init__(self, message=None):
        if not message:
            message = u'Must be a valid UK Post Code'
        self.message = message

    def __call__(self, form, field):
    if not validation.is_valid_postcode(field.data):
        raise ValidationError('Invalid UK Post Code')

post_code_validator = PostCodeValidator

class RegisterForm(Form):
    #  ...
    postcode = StringField('Postcode', validators=[DataRequired(), post_code_validator])

【讨论】:

以上是关于以 python 形式使用 uk-postcode-utils的主要内容,如果未能解决你的问题,请参考以下文章

Python Tkinter。以画布形式打开 BMP 文件

字符串中的数字以“非数字”或错误形式出现 - Python [重复]

Python实现栈队列

在python中,以字符串形式获取系统命令的输出[重复]

python 以文档形式读入读出

强制python不以标准形式/科学记数法/指数形式输出浮点数[重复]