2017-02-16 11 views
0

SOの新機能で、私の質問が関連し、ルールに適合することを願っています。Flaskに複数のエンティティを含むフォームを作成するにはどうすればよいですか?

私はpythonマイクロフレームワークのFlaskを試しています。ここまでは順調ですね。

チュック:

from app import db 
from sqlalchemy.orm import relationship 
from sqlalchemy import Table, Column, Integer, ForeignKey 
import TrucAttribute 

class Truc(db.Model): 
    __tablename__ = 'app_truc' 
    id = db.Column(db.Integer, prymary_key = True) 
    owned_attributs_de_truc = db.relationship('TrucAttribute', backref="truc", cascade="all, delete-orphan", lazy="dynamic") 

# Truc business methods ... 

TrucAttribute:

from app import db 
from sqlalchemy.orm import relationship 
from sqlalchemy import Table, Column, Integer, ForeignKey 
import Truc 

class TrucAttribute(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    truc_id = db.Column(db.Integer, db.ForeignKey('app_truc.id')) 
    truc_owner = relationship("Truc", backref="attributs_de_truc") 

    @staticmethod #return a list usable for forms 
    def form_list(): 
     attributs = TrucAttributes.query.all() 
     attributs_list = [] 
     for attribut in attributs: 
     attributs_list.append((unicode(attribut.id), unicode(attribut.name)) 
     return attributs_list 

forms.py:作成から

from flask_wtf import Form 
from wtforms import SelectField 
from app.models.trucAttributes import TrucAttribute 

class CreateTrucForm(Form): 
    truc_attribute = SelectField(u'Truc Attribute', choices=TrucAttribute.form_list()) 

コード以下のように2つのエンティティ(多くのTrucAttribute 1つチュック)を考えます。 html:

Truc Attribute : 
{{ form.truc_attribute() }} 

とコントローラ:私はTrucAttributeの選択リストでチュック作成フォームを作成するにはどうすればよい

@app.route('/create/truc', methods=['GET', 'POST']) 
def createTruc(): 
    form = CreateTrucForm() 
    return render_template('create/CreateTruc.html', form=form) 

?これまでは、Flask Mega Tutorialに基づいた非常に単純なフォームしか作成していませんでした。

ありがとうございます!

+1

フォームを作成するコードも投稿できますか?これはSelectFieldで行うことができますが、テンプレートをレンダリングする前にリストに値を設定する必要があります。あなたが現在持っているものを分かち合うことができれば、選択リストがうまくいかない場合、あなたを助けるのがより簡単になります。 – Hannu

+0

私は上に想像したソリューションを追加しました。それは正しい方法ですか? –

+0

それはよく見えます。あなたがそれを実行するとどうなりますか?私は整数であるため、attribut_idをunicodingしないで、そのように扱い、attributs_list.append((attribut.id、unicode(attribut.name))とすることができます。あなたのtruc_attributeにはエントリがありますか?あなたのフィールド?静的メソッドのreturnステートメントの直前に "print attributs_list"を追加すると、何が起きますか?コードが実行されますか?出力は正常に見えますか? – Hannu

答えて

0

あなたの静的メソッドは絶対に良いはずです。私がよくわからないのは、このソリューションがいかにダイナミックであるかだけです。 TrucAttributeに追加または削除されると、それは更新されますか?起動時にのみ照会されるとは限りません。私は少し違って、render_templateを呼び出す前にapp.route関数で使用します。次にフォームクラスにchoices = ...を定義する必要はありません。

form.truc_attribute.choices = [(a.id,a.name) for a in Session.query(TrucAttribute).\ 
           order_by(TrucAttribute.a_name).all()] 
render_template(.....) 

しかし、静的メソッドは正常に動作するはずです。私はアルファベット順に自分の選択肢を注文し、それを正確に行うためにorder_byを使います。

もう1つのヒント。

class CreateTrucForm(Form): 
    truc_attribute = SelectField("Attribute", coerce=int) 

をして、私は上記のようなリストを作成する:あなたが持っているしたい場合は、フォームは、このようにクエリを簡素化し、ユーザーが選択した文字列の代わりに対応するIDの整数を返す、あなたのフォームクラスに設定することができますポストリクエストの後にフォームを解析するときに、intergersを戻す必要があります。

これが役に立ちます。

ハヌ

+0

ウェブページを更新するたびに質問しませんか?ヒントをありがとう! –

関連する問題