【问题标题】:How to make a dynamic RadioField如何制作动态 RadioField
【发布时间】:2019-03-10 09:55:37
【问题描述】:

我想制作一个包含多个选项的考试表格。 如何避免在表单类中手动写radioField,radioField重复N

views.py

@app.route("/exams", methods=['GET', 'POST'])
def exams():
    radios = []
    if request.method == 'POST':
        #exam_answers_form = forms.(request.form)
        class NForm(forms.ExamAnswersForm):
            pass
        n = NForm()
        datos = Questions.query.add_columns('question').filter_by(modules_id=5).all()

        for name in datos:
            setattr(n, 'question', RadioField(name, choices=[('value','descriptions'),('value_two','whatever')]))
            n.question.append()
        x = n        
        return render_template('exams/exams_answers.html', form=x )
    return render_template('exams/exams.html')

forms.py

class ExamAnswersForm(Form):
    question = RadioField(choices=[()])

【问题讨论】:

标签: python flask flask-wtforms


【解决方案1】:

您可以编写这样的动态表单,假设您知道如何查询数据库以返回可以调整以下代码以适合您的格式的数据:

class ExamAnswersForm(Form):
    # get static data from database
    data = {'q_1': ('Is FEAR a good book?', (1, 'Yes'), (0, 'No')),
            'q_2': ('Is the Earth flat?', (0, 'Yes'), (1, 'No'))} 
    for label in data.keys():
        vars()[label] = RadioField(data[label][0], choices=[data[label][1], data[label][2]])

如果你想让它更动态,你可以创建一个返回初始化表单的方法:

def exam_answers_form(*args, **kwargs):
    # do something with *args and **kwargs to get dynamic data from database
    data = {'q_1': ('Is FEAR a good book?', (1, 'Yes'), (0, 'No')),
            'q_2': ('Is the Earth flat?', (0, 'Yes'), (1, 'No'))}
    class ExamAnswersForm(Form):
        pass
    for label in data.keys():
        setattr(ExamAnswersForm, label, RadioField(data[label][0], choices=[data[label][1], data[label][2]]))
    return ExamAnswersForm()

【讨论】:

  • 我使用了这个解决方案,它对我有用。我没有使用 setattr() 函数。相反,对我有用的是将所有 RadioField() 参数作为关键字参数而不是位置参数和关键字参数的混合传递。
猜你喜欢
  • 1970-01-01
  • 2013-01-13
  • 2015-10-04
  • 1970-01-01
  • 1970-01-01
  • 2019-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多