2017-09-24 72 views
0

我学习使用瓶,神社,WTForms语言创建测验样的Web应用程序,SQLAlchemy的等一旦用户通过存储在所有级别成功完成去这样的语言课程JSON文件我希望应用程序为他提供练习模式,用户将在其中回答随机选择的级别。validate_on_submit()失败时,单选按钮选择是动态生成

当我运行应用程序,我可以看到从随机水平值产生的,因为我想单选按钮,但是当我选择任何答案并提交,form.validate_on_submit()返回False和form.errors返回{ 'practiceform':[u'Not一个有效的选择']}。当我将值硬编码为currentLevel变量时,它可以正常工作。

views.py

@user_blueprint.route('/courses/<course>/quiz/practice',methods=['GET','POST']) 
@login_required 
def practice(course): 
    courseClass = class_for_name("project.models", course.capitalize()) 
    courses = courseClass.query.filter_by(email=current_user.email).first() 
    maxLevel = courseClass.query.filter_by(email=current_user.email).first().get_maxLevel() 
    currentLevel = randint(0, maxLevel-1) # If this value is hard-coded or fetched from db, it works correctly 

    dic = generateQuestion(course, currentLevel) 
    display = dic["display"] 
    correct = dic["correct"] 
    options = dic["options"] 

    form = PracticeForm(request.form) 
    form.practiceform.choices = [(option, option) for option in options] 


    if form.validate_on_submit(): 
     practiceForm = form.practiceform.data 

     if ((practiceForm == correct) and courses): 
      # Do something 
      flash("Nice job", 'success') 
      return redirect(url_for('user.practice', course=course)) 

     else: 
      # Do something else 
      flash("Wrong answer", 'danger') 
      return redirect(url_for('user.practice', course=course)) 

    return render_template('courses/practice.html', form=form, display=display) 

forms.py

class PracticeForm(Form): 

    practiceform = RadioField('practice') 

practice.html

{% extends "_base.html" %} 
{% block content %} 

<form action='' method='POST' role='form'> 
    <p> 
     <!-- Tried put form.csrf, form.csrf_token, form.hidden_tag() here --> 
     {{ form.practiceform() }} 
    </p> 
    <input type="submit" value="submit" /> 
</form> 
{% endblock %} 

那么,要我想念那里?是什么让差异可以说,硬编码的25级,其工作正常,或25号randint内随机生成的?

回答

0

所以我发现,randint()问题引起的因为实践(当然)方法被调用的GET和POST行为而导致有两个不同的整数 - >两种不同形式的大部分时间。所以我重构了代码。保留我们采取行动的做法(当然)方法,并创建了处理POST操作的新方法,这解决了这个问题。

0

我的猜测是optionint,bug WTForms从request.form得到str

当数据从它被WTForms视为string请求,除非你用coerce kwarg的wtforms.fields.*Field构造函数的显式指定类型回来:

practiceform = RadioField('practice', coerce=int)