2016-10-02 9 views
1

データベース(データセット)値をフォームフィールドにあらかじめ入力する必要があります。 問題は、フォームクラスに引数を送信する方法がわかりません。私はいつも、私はPYで初心者だPython Flask:別の関数から既定の既定値にフォームクラス引数を送信

'produto' is not defined 

私はエラーを取得しようとした

# 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()) 

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まあのすべて。一晩中一晩研究しています。前もって感謝します。

+1

あなたが '' produtosとしてprodutosalcaをインポートするが、あなたはありませんSとproduto' 'としてそれを使用します。プロダクトの名前をプロドゥートに変更します。 –

+0

ちょっと@odialghamdi thxです。私はこの部分を削除するのを忘れました。同じ名前を使用しても、AttributeError: 'Table'オブジェクトには属性 'Descricao'がないため、機能しません。 produtosalcaはdbテーブルです。 –

+0

あなたのクラス 'table'は、クラス –

答えて

-2

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

の属性として' Descricao'を持っていません。 'Form'はFlask-WTF 0.13で' FlaskForm'に名前が変更されました。 'Form'は廃止されたエイリアスです。 – davidism

+0

また、問題はtypoです。 – davidism

+0

@davidismしかし、なぜ私のソリューションが完璧に機能するので、なぜdownvoteを知りません!私はFlask-WTFを使用しています0122 – ettanany

関連する問題