Frasco WTForms siempre da falso en validate_on_submit ()

He creado un formulario de registro utilizando wtforms. Estoy usando FormField en él para no tener que repetir algunos de los elementos del formulario nuevamente. Pero siempre que hago clic en el botón Enviar, siempre me da falso en la invocación del método validate_on_submit. No entiendo por qué está sucediendo esto.

Mi form.py es el siguiente:

 class ProfileInfoForm(Form): firstname = TextField('firstname', validators= [validators.Required("Please enter First name.")]) lastname = TextField('lastname', validators= [validators.Required("Please enter Last name.")]) email = EmailField('email', validators= [validators.Required("Please enter your valid email.")]) gender = RadioField('gender', validators= [validators.Required("Please select gender")], choices=[('female', 'Female'), ('male', 'Male')]) dob = TextField('dob', validators= [validators.Required("Please select date of birth.")]) languages = SelectMultipleField('languages', choices=[('', '')], validators= [validators.Required("Please select\ atleast one \ language.")]) class RegistrationForm(Form): profilefield = FormField(ProfileInfoForm) password = PasswordField('password', validators= [validators.Required("Please enter password."), validators.Length(min=8), validators.EqualTo('confirm_password', message='Password and confirm\ password must match')]) confirm_password = PasswordField('confirm_password', validators= [validators.Required("Please enter\ confirm password.")]) tnc = BooleanField('tnc', validators= [validators.Required("Please select Terms and \ Conditions")], default=False) submit = SubmitField('Create My Account') 

Signup método de Signup es el siguiente:

 @module.route('/signup', methods=['GET', 'POST']) @handle_error def signup(): if hasattr(g, 'user') and g.user: # TODO: do some operations if needed else keep it blank return redirect(url_for('index')) else: signup_form = RegistrationForm() # Add choices for the user signup_form.profilefield.languages.choices = getLanguages() if signup_form.validate_on_submit(): firstname = signup_form.profilefield.firstname.data lastname = signup_form.profilefield.lastname.data email = signup_form.profilefield.email.data password = signup_form.password.data # confirm_password = signup_form.confirm_password.data gender = signup_form.profilefield.gender.data dob = signup_form.profilefield.dob.data languages = signup_form.profilefield.languages.data tnc = signup_form.tnc.data payload = {'firstname': firstname, 'lastname': lastname, 'email': email, 'password': password, 'gender': gender, 'dob': dob, 'languages': languages, 'tnc': ('1' if tnc else '0')} try: buildApiUrl = BuildApiUrl() response = requests.post(buildApiUrl.getUrl("user", "signup"), data=payload) if response.status_code == requests.codes.ok: data = json.loads(response.text) if 'status' in data and data['status'] != 200: flash(data['message'], category="error") else: flash(data['message'] + ': Your account is created successfully! ' + 'Please login to your account!', category="success") return redirect(url_for('index')) except requests.exceptions.RequestException: flash('Internal Server side error occured', category="error") return redirect(url_for('server_error', e='500')) return render_template('public/index.html', signup_form=signup_form, login_form=LoginForm()) 

Formulario HTML está presente en la esencia aquí

Para su información: Estoy poniendo todos los campos requeridos con los datos reales necesarios. Sigo recibiendo falso cuando llamo validate_on_submit (). ¿Qué esta mal en mi codigo?

    EDITAR: getLanguages ​​es un método que recupera idiomas de la base de datos y los coloca en la lista de selección. Esta funcionalidad está ocurriendo como se esperaba y puedo obtener una lista de idiomas.

    Edición 2: Realiza una cosa aquí. Esto sucede debido a FormField, ya que lo probé agregando todos los campos de ProfileInfoForm () al método RegistrationForm (), y todo funcionó bien y pude registrarme. Por lo tanto, algunos problemas con el FormField o la forma en que lo estoy utilizando, pero no estoy seguro de dónde está yendo mal.

    Descubrí que el problema no es con FormField sino con mi ProfileInfoForm (). Siempre devuelve falso. Aún no tengo razón, pero creo que debo tener que escribir mi propia validación para esa materia. ¿Alguna idea?

    Editar:

    En el vertedero conseguí el siguiente (pprint usado aquí):

     {'SECRET_KEY': '1e4c35233e50840483467e8d6cfe556c', '_errors': None, '_fields': {'csrf_token': , 'dob': , 'email': , 'firstname': , 'gender': , 'languages': , 'lastname': }, '_prefix': u'profilefield-', 'csrf_enabled': True, 'csrf_token': , 'dob': , 'email': , 'firstname': , 'gender': , 'languages': , 'lastname': } 

    Editar:

    Excavo un poco y descubrí que el error generado se debe a que falta el token csrf. Pero he incluido {{ signup_form.hidden_tag() }} en mi plantilla de formulario en html. y puedo ver la etiqueta oculta en el HTML generado cuando inspecciono el elemento y puedo ver el campo csrf_token con valor hash. Entonces, ¿qué está mal aquí?

    Resolví mi problema con la siguiente función:

     def __init__(self, *args, **kwargs): kwargs['csrf_enabled'] = False super(ProfileInfoForm, self).__init__(*args, **kwargs) 

    ProfileInfoForm() esta función en ProfileInfoForm()

    El problema fue que FormField incluye el campo csrf_token así como también el formulario Real, es decir, RegistrationForm también incluía csrf_token, por lo que había dos csrf_token que debían verificarse y solo uno estaba siendo procesado. Entonces, deshabilité csrf_token en ProfileInfoForm modo que cuando FormField lo representó, tenía csrf_token = False .

    Y RegistrationForm tiene csrf_token habilitado todavía ahora, por lo que el formulario sigue siendo seguro.

    Mi conjetura es que esto también debe hacerse en FormField también.

    FYI: Esta solución podría estar equivocada debido a mi interpretación del código FormField. Por favor corríjame si me equivoco en la solución anterior.