Python Flask:从另一个函数发送一个表单类参数以预填充默认值

时间:2016-10-02 09:31:23

标签: python forms flask arguments flask-wtforms

我需要使用数据库(数据集)值预填充表单字段。 问题是我不知道如何将参数发送到表单类。

forms.py

# coding: utf-8
from db import produtosalca as produtos ##dataset imports db['table']
from flask_wtf import FlaskForm
from wtforms import TextField, BooleanField, SubmitField, TextAreaField, validators, ValidationError

class ProductForm(FlaskForm,produto):
    descricao = TextField("Nome", default=produto.Descricao)        
    classificacaoFiscal = TextField("NCM", default=produto.ClassificacaoFiscal) 
    mva = TextField("MVA",default=produto.MVA)

app.py

# coding: utf-8
import os
from werkzeug import secure_filename
from flask import (
    Flask, request, send_from_directory, render_template, current_app, flash
    )
from db import produtosalca
from forms import ContactForm, ProductForm

app = Flask("alcax")

PROJECT_ROOT = os.path.abspath(os.path.dirname(__file__))
app.config['MEDIA_ROOT'] = os.path.join(PROJECT_ROOT, 'media_files')

app.secret_key = 'development key'

@app.route('/productform', methods=['GET','POST'])
def productform(product):
    form = ProductForm(request.form,product) ## here i was gonna send product
    if request.method == 'POST':
        'posted'
    elif request.method == 'GET':
        return render_template('productform.html', form=form.content())

我尝试的一切总是让我错误

'produto' is not defined

我是py的初学者。一直在研究整夜。提前谢谢。

1 个答案:

答案 0 :(得分:-1)

请注意class ProductForm(FlaskForm)表示来自FlaskForm的ProductForm。您案例的简单解决方案如下:

<强> forms.py:

from flask_wtf import FlaskForm
from wtforms import TextField


class ProductForm(FlaskForm):
    descricao = TextField("Nome")
    classificacaoFiscal = TextField("NCM")
    mva = TextField("MVA")

<强> app.py:

from flask import Flask, render_template, redirect, request
from forms import ProductForm

app = Flask(__name__)
app.secret_key = 'development key'


@app.route('/productform', methods=['GET','POST'])
def productform():
    form = ProductForm(descricao='default_descricao', classificacaoFiscal='default_classificacaoFiscal', mva='default_mva')
    if form.validate_on_submit():
        form = ProductForm(request.form)
        # Do something with your form and redirect the user to some page.
    return render_template('productform.html', form=form)


if __name__ == "__main__":
    app.run(host="0.0.0.0", debug=True)

<强>模板/ _formhelpers.html

{% macro render_field(field) %}
  <dt>{{ field.label }}
  <dd>{{ field(**kwargs)|safe }}
  {% if field.errors %}
    <ul class=errors>
    {% for error in field.errors %}
      <li>{{ error }}</li>
    {% endfor %}
    </ul>
  {% endif %}
  </dd>
{% endmacro %}

<强>模板/ productform.html

<html !DOCTYPE>
<head>
<title>Flask WTF</title>
</head>
<body>
{% from "_formhelpers.html" import render_field %}
<form method="POST" action="/submit">
    <dl>
    {{ form.hidden_tag() }}
    {{ render_field(form.descricao, size=20) }}
    {{ render_field(form.classificacaoFiscal, size=20) }}
    {{ render_field(form.mva, size=20) }}
    </dl>
    <input type="submit" value="Go">
</form>
</body>
</html>

修改以考虑以下评论中的新查询:

<强> forms.py:

class ProductForm(FlaskForm):

    descricao = TextField("Nome")
    classificacaoFiscal = TextField("NCM")
    mva = TextField("MVA")
    # ...

    def __init__(self, *args, **kwargs):
        super(ProductForm, self).__init__(*args, **kwargs)
        if 'product' in kwargs:
            self.descricao.data = kwargs['product'][0]
            self.classificacaoFiscal.data = kwargs['product'][1]
            self.mva.data = kwargs['product'][2]
            # ...

<强> app.py:

@app.route('/productform', methods=['GET','POST'])
def productform():
    # product to be retrieved from your database
    form = ProductForm(product=product)
    if form.validate_on_submit():
        form = ProductForm(request.form)
        # Do something with your form and redirect the user to some page.
    return render_template('productform.html', form=form)
相关问题