2017-03-25 7 views
0

Morning Fellas!TypeError: 'RegistrationForm' Objekt ist nicht aufrufbar

Ich habe einige Probleme mit einer Flask-Form. Hier ist der Code (python2.7):

views.py

# third-parties imports 
    from flask import flash, redirect, render_template, url_for 
    from flask_login import login_required, login_user, logout_user 

    # local imports 
    from . import auth 
    from forms import LoginForm, RegistrationForm 
    from .. import db 
    from ..models import Empregado 

    @auth.route('/register', methods=['GET', 'POST']) 
    def register(): 
     form = RegistrationForm() 
     if form.validate_on_submit(): 
      empr = Empregado(email=form.email.data, 
        username=form.username.data, 
        first_name=form.first_name.data, 
        last_name=form.last_name.data, 
        password=form.password.data) 
      db.session.add(empr) 
      db.session.commit() 
      flash('Registration complete! Go ahead and Login!') 

      # done registration. Heads for login 
      return redirect(url_for('auth.login')) 

     # When FLASK_DEBUG = 1, it yells a TypeError on the following line 
     return render_template('auth/register.html', form=form('utf8'), title='Register') 

forms.py

Altough Registrationform ist nicht aufrufbar ist Loginform gemacht auf Auth/login.html , so dass das Codefragment nur auf den Fehler bei auth/register.html fokussiert ist.

# -*- coding: utf-8 -*- 

# app/auth/forms.py 

from flask_wtf import FlaskForm 
from wtforms import PasswordField, StringField, SubmitField, ValidationError 
from wtforms.validators import DataRequired, Email, EqualTo 
from ..models import Empregado 

class RegistrationForm(FlaskForm): 

    email = StringField('Email', validators=[DataRequired(), Email()]) 
    username = StringField('User', validators=[DataRequired()]) 
    first_name = StringField('First name', validators=[DataRequired()]) 
    last_name = StringField('Last name', validators=[DataRequired()]) 
    password = PasswordField('Password', validators=[DataRequired(), EqualTo('retype')]) 
    retype = PasswordField('Retype Password') 
    submit = SubmitField('submit') 

def validate_email(self, field): 
    if Empregado.query.filter_by(email=field.data).first(): 
     raise ValidationError('Email already used') 

def validate_username(self, field): 
    if Empregado.query.filter_by(username=field.data).first(): 
     raise ValidationError('User already exists') 

class LoginForm(FlaskForm): 

    email = StringField('Email', validators=[DataRequired(), Email()]) 
    password = PasswordField('Password', validators=[DataRequired()]) 
    submit = SubmitField('Login') 

Traceback

File "~/Sources/py2/business_masters/app/auth/views.py", line 40, in register 

return render_template('auth/register.html', form=form('utf8'), title='Register') 

TypeError: 'RegistrationForm' object is not callable 

Ich habe für Tippfehler und Verzeichnisse doppelt geprüft, aber alles scheint in Ordnung ... Ich bin fest auf dieser (meiner ersten Website, also bitte, gehen Sie nicht hart an diesem armen dev ...). Ich schätze Ihr Verständnis und Zeitgenossen!

+0

Bitte fügen Sie Ihr 'RegistrationForm' Teil hinzu. – McGrady

+0

Warum machst du 'form = form ('utf8')' und nicht nur 'form = form'? – bernie

+0

Weil es an mir schreit UnicodeDecode Fehler, wenn ich nicht ... Ich glaube, python2.7 Standardcodierung ist 'ascii' –

Antwort

0

form=form('utf8') was bedeutet, dass Sie eine Klasse Objekt zu form keine Instanz übergeben.

Versuchen Sie, return render_template('register.html', form=form) zu verwenden.

Hier ist ein Beispiel, überprüfen Sie den Code aus und vergleichen Sie mit Ihrem RegistrationForm:

from wtforms import Form, StringField, validators 

class RegistrationForm(Form): 
    username = StringField('Username', [validators.Length(min=4, max=25)]) 
    email = StringField('Email Address', [validators.Length(min=6, max=35)]) 

@app.route('/register', methods=['GET', 'POST']) 
def register(): 
    form = RegistrationForm() 

    if request.method == 'POST' and form.validate(): 
     user = User(form.username.data, form.email.data, 
        form.password.data) 
     db_session.add(user) 
     flash('Thanks for registering') 
     return redirect(url_for('login')) 
    return render_template('register.html', form=form) 

register.html:

<form class="form form-horizontal" method="post" role="form"> 
    {{ form1.hidden_tag() }} 
    {{ wtf.form_errors(form1, hiddens="only") }} 
    {{ wtf.form_field(form1.email,form_type="horizontal") }} 
    {{ wtf.form_field(form1.username,form_type="horizontal") }} 
    {{ wtf.form_field(form1.first_name,form_type="horizontal") }} 
    {{ wtf.form_field(form1.last_name,form_type="horizontal") }} 

    <div class="col-sm-offset-2 col-sm-10"> 
    <button name="action_save1" type="submit" class="btn btn-primary">submit</button> 
    </div> 
</form> 

Weitere Details ab Form Validation with WTForms.

+0

Danke! Ich vergleiche und teile die Ergebnisse! –

+0

@ G.BossNoobware können Sie 'import sys reload (sys) sys.setdefaultencoding ('utf-8')' verwenden, um UnicodeDecode Fehler zu vermeiden und 'form = form ('utf8')' in 'form = form' zu ändern – McGrady

+0

@ G.BossNoobware können Sie einfach 'form = RegistrationForm()' – McGrady

Verwandte Themen