2016-10-02 49 views
1

我需要預先填充帶有數據庫(數據集)值的表單字段。 問題是我不知道如何將參數發送到窗體類。Python Flask:從另一個函數發送表單類參數以預先填充默認值

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

的進口produtosalca爲''produtos,但你使用它作爲'produto'與無S。將'produtos'重命名爲'produto' –

+0

嗨@odaialghamdi thx輸入。我忘了刪除這部分。即使我使用相同的名稱,它也不起作用,因爲它說AttributeError:'表'對象沒有'Descricao'屬性。 produtosalca是一個數據庫表。 –

+0

您的班級'table'沒有'Descricao'作爲班級的屬性 –

回答

-2

請注意class ProductForm(FlaskForm)表示ProductForm從FlaskForm開始。對於你的情況簡單的解決辦法如下:

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) 
+0

'Form'已經在Flask-WTF 0.13中重命名爲'FlaskForm'。 'Form'是一個不推薦的別名。 – davidism

+0

另外,這個問題是一個錯字。 – davidism

+0

@davidism但我不知道爲什麼downvote,因爲我的解決方案完美!我正在使用Flask-WTF 0.12 – ettanany

相關問題