【问题标题】:Flask - Pre-populate Fields from a text fileFlask - 从文本文件中预填充字段
【发布时间】:2018-04-04 14:42:00
【问题描述】:

我正在寻找一种简单的方法来使用文本文件中的数据预填充表单的字段。

这是我的导入:

#For Flask
from flask import Flask, render_template, flash, request, redirect, url_for, send_file 
#For Web Form
from wtforms import Form, TextField, TextAreaField, validators, StringField, SubmitField, SelectField, RadioField, IntegerField, DateTimeField, DecimalField, FloatField
from werkzeug.utils import secure_filename
import re #For Regex

我的表单有以下类:

class MainForm(Form):
    #Regex
    reEmail_comp = re.compile('^.+@.+\..+$')
    reJobname_comp = re.compile('[^\s]+[\w]+$')

    #Form Fields
    familyname = TextField('Family Name:',
    validators=[validators.DataRequired()])

    firstname = TextField('First Name:',
    validators=[validators.DataRequired()])

    email = TextField('Email:',
    validators=[validators.DataRequired(),
    validators.Length(min=3, max=51),
    validators.Regexp(regex=reEmail_comp)])

    # Copy List of Job Templates 
    list_job_name = list_job_templates

    # Create List of Tuples
    choices_list = list(zip(list_job_name,list_job_templates))

    # Generate string to be evaluate as analyses Radiofield
    radio_string = ("RadioField('Analysis Type:',"
    "validators=[validators.DataRequired()],choices="+str(choices_list)+")")

    # Attribute value to element as a variable
    locals()["analyses"] = eval(radio_string)

    jobname = TextField('Job Name:',
    validators=[validators.DataRequired(),
    validators.Length(min=3, max=100),
    validators.Regexp(regex=reJobname_comp)])

    jobdescription = TextAreaField('Job Description:',
    validators=[validators.Optional(),
    validators.Length(min=0, max=10000)])

还有以下观点:

@app.route('/home', methods=['GET', 'POST'])
def home():
    form = MainForm(request.form)

    print(form.errors)
    if request.method == 'POST':
        familyname=request.form['familyname']
        firstname=request.form['firstname']
        email=request.form['email']
        analyses=request.form['analyses']
        jobname=request.form['jobname']
        jobdescription=request.form['jobdescription']
        if jobdescription == "":
            jobdescription = "No Description"
        nextpage=request.form['submit'] #Get submission button value

        if form.validate():

            #Print Temp file
            print("||".join(["Family Name={}".format(familyname),
                    "First Name={}".format(firstname),"E-Mail={}".format(email),
                    "Analyse={}".format(analyses),"Job Name={}".format(jobname),
                    "Job Description={}".format(jobdescription)]),
                    file=open(submission_dir+"temp1", "w"))

            #Redirections following which button has been clicked
            if nextpage == 'Continue to Submission':
                return redirect(url_for('nextpage'))
            else:
                return redirect(url_for('nextbis'))

        else:
            flash('Error: Please make sure that all the fields are correctly filled.')


    return render_template('home.html', form=form)

用户有权访问表单并可以填写它。 正如您在视图中看到的,有一个步骤,在此步骤中,一旦用户提交信息,所有信息都将存储在临时“temp1.txt”文件中。
我想做的是让用户可以选择返回此表单,以防他想修改他之前提交的信息。

为了简化这一点,我希望表单显示相同的字段,但这次预先填充了上次提交的临时文本文件中的信息。

我怎样才能以简单的方式做到这一点?

【问题讨论】:

    标签: python flask wtforms


    【解决方案1】:

    如果您创建了一个表单并从请求中填充它,那么可以对文件值进行同样的操作。

    form = MainForm(read_file_in_correct_format())
    

    read_file_in_correct_format 方法返回对象 {fieldname:value}。保存为 JSON 可能会更好,这样您就可以轻松解析它并支持更复杂的结构。

    您所要做的就是根据request.method正确初始化表单

    @app.route('/home', methods=['GET', 'POST'])
    def home():
        if request.method == 'POST':
            # so if form is submitted, populate it from request
            form = MainForm(request.form)
            ...
        else:
            # if we are just viewing form, then try to load stored values from temp1.txt
            form = MainForm(read_file_in_correct_format())
    

    【讨论】:

    • 我不确定。当用户加载表单时,不应预先填充任何字段。第一次提交后应该是这样,以防用户返回此页面。在您的示例中,我不明白如果我用您的建议替换它,我应该如何处理我之前拥有的form = MainForm(request.form)。如果您的答案可以更准确,那将很有帮助。 (感谢您提供有关 JSON 的提示,我会检查一下!)顺便说一句,我进行了编辑,以便您可以看到我的导入,Form 是从 wtforms 导入的。
    • 更新示例.. 更有意义?
    • 是的,这更清楚了,谢谢!我不应该创建一个 MainForm 的其他类吗?由于该类需要包含函数,因此需要读取 json 文件并生成已经填充了之前提交的 json 文件中定义的默认值的字段。或者我还应该更新我现有的 Class MainForm 吗?
    • 我认为您的答案有效,但对我不起作用。例如,我如何仅在“familyname”字段上对其进行测试?我试过这个:else:form = MainForm(request.form)form.familyname.process_data = "string_to_display in the field" 但它不起作用。
    • 所以最后我实现了你的想法,但它只是部分工作,我解释说:阅读文档后,我决定创建一个函数read_file_in_correct_format(),它返回一个 MultiDict 对象(因为不支持诸如 {fieldname:value} 之类的简单字典,我的 getlist 有错误)。我说它正在部分工作,因为尽管我的 TextField 仍然没有预填充,但我的 RadioField 已为先前选择的分析进行了很好的预选。我想我真的很接近了,如果您对 TextField 有任何想法,请告诉我。
    猜你喜欢
    • 1970-01-01
    • 2011-12-29
    • 1970-01-01
    • 1970-01-01
    • 2021-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-28
    相关资源
    最近更新 更多