Использование uk-postcode-utils в форме Python - PullRequest
0 голосов
/ 07 марта 2019

Я создаю форму для пользователя, чтобы ввести действительный почтовый индекс Великобритании.В настоящее время у меня есть следующий код для формы:

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' не повторяется.

Что я могу сделать, чтобы это исправить?

Редактировать: Вот полная запись формы и шаблон для веб-страницы.Большое спасибо.

1 Ответ

0 голосов
/ 08 марта 2019

Вы неправильно используете валидаторы WTForms в своем postcode StringField.

Объявите функцию, которая принимает параметры формы и поля и выдает ошибку, если почтовый индекс недействителен, в этой функции выиспользуйте функцию 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 .

Что-то вроде (не проверено):

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])
...