2013-07-26 2 views
7

मैं एक फ्लास्क फॉर्म में एक sqlalchemy अनुरोध के परिणामों से भरा एक चुनिंदा फ़ील्ड रखने की कोशिश कर रहा हूं।फ्लास्क में QuerySelectField का उपयोग कैसे करें?

def possible_book(): 
    return Book.query.with_entities(Book.id).all() 

class AuthorForm(Form): 
    familyname = TextField('familyname', [validators.Required()]) 
    firstname = TextField('firstname', [validators.Required()]) 
    book_list = QuerySelectField('book_list',query_factory=possible_book,get_label='title',allow_blank=True) 

इस टेम्पलेट है:

यहाँ कोड हैं

<form action="" method="post" name="edit_author" enctype="multipart/form-data"> 
    {{form.hidden_tag()}} 
    <p>Veuillez donner son prénom (obligatoire) : {{form.firstname(value=author.firstname)}}</p> 
    <p>Nom de famille (obligatoire) : {{form.familyname(value=author.familyname)}}</p> 
    <p>Livre : {{form.book_list}}</p> 

    <p><input type="submit" value="Envoyer"></p> 
</form> 

दृश्य:

@app.route('/edit_author/<number>', methods = ['GET', 'POST']) 
    def edit_author(number): 
    if number == 'new': 
     author = [] 
    else: 
     author = Author.query.filter_by(id = number).first() 
    form = AuthorForm() 
    if form.validate_on_submit(): 
     a = Author(firstname= form.firstname.data, familyname= form.familyname.data) 
     a.books = form.book_list.data 

     db.session.add(a) 
     db.session.commit() 
    return redirect('/admin') 
return render_template('edit_author.html', form = form, author = author) 

मॉडल (चिपकाया केवल साहचर्य की मेज और लेखक की मेज, अधिकांश कॉलम प्रश्न से बाहर हैं)

author_book = db.Table('author_book', 
    db.Column('author', db.Integer, db.ForeignKey('author.id')), 
    db.Column('book', db.Integer, db.ForeignKey('book.id')) 
) 

class Author(db.Model): 
    id = db.Column(db.Integer, primary_key = True) 
    firstname = db.Column(db.String(64), index = True) 
    familyname = db.Column(db.String(120), index = True) 
    website = db.Column(db.String(120)) 
    dateofbirth = db.Column(db.DateTime) 
    placeofbirth = db.Column(db.String(120)) 
    nationality = db.Column(db.String(120)) 
    biography = db.Column(db.Text) 
    photo = db.Column(db.String(120)) 
    books = db.relationship('Book', secondary=author_book,backref=db.backref('author', lazy='dynamic')) 

मैं इस समय इस त्रुटि मिलती है:

UnmappedInstanceError: Class 'sqlalchemy.util._collections.KeyedTuple' is not mapped 

क्या मैं वास्तव में चाहते हैं कि चुनिंदा क्षेत्र लेखक का नाम और उसका नंबर दिखाने के लिए, और (अनुप्रयोग के लिए लेखक संख्या लौट समारोह "add_author कहा जाता है " शीर्ष पर)।

धन्यवाद।

+0

आप अपने possible_book() विधि का परीक्षण किया और सुनिश्चित रूप में इरादा है कि यह काम करता है है? – codegeek

+0

मुझे नहीं पता कि "परीक्षण" से आपका क्या मतलब है। संभव_बुक सिर्फ एक प्रश्न है, और यह काम करता है, कोई समस्या नहीं है। यह सिर्फ पुस्तकों की पूरी सूची लौटाता है (या लेखक यदि आप दूसरी तरफ उपयोग करते हैं)। लेकिन मुझे पूरा यकीन है कि इसे फ़ॉर्म या टेम्पलेट या किसी अन्य चीज़ द्वारा व्याख्या करने के लिए कुछ और चाहिए। मुझे आश्चर्य है! यही वह नहीं है जो मुझे समझ में नहीं आता है: इसे फ़ॉर्म के साथ कैसे काम करना है? – 22decembre

उत्तर

6

आप दो समस्याएं हैं:

  1. के रूप में शॉन विएरा अपने जवाब में बताया, query_factory कॉलबैक लौटना चाहिए एक प्रश्न, न कि परिणाम।

  2. query_factory कॉलबैक को आपकी इकाइयों की किताबों में, पूरी तरह से इकाइयों को वापस नहीं करना चाहिए, पुस्तकें आईडी नहीं। मेरा मानना ​​है कि QuerySelectField क्वेरी के परिणामों का उपयोग करने की कोशिश कर रहा है जैसे कि वे ऑब्जेक्ट मैप किए गए हैं लेकिन आईडी (KeyedTuple उदाहरणों के रूप में लौटाए गए) नहीं हैं।

मुझे लगता है कि इस कॉलबैक फ़ंक्शन कोड करने के लिए सही तरीका है:

def possible_book(): 
    return Book.query 
+0

, ऐसा लगता है कि उत्तर की शुरुआत मिली है! अब, मेरे पास चुनिंदा क्षेत्र है! – 22decembre

+0

प्रिय @ मिगुएल क्या आप कृपया मुझे [sqlalchemy.exc.InterfaceError फ्लास्क में मदद कर सकते हैं] (http: // stackoverflow।कॉम/प्रश्न/24732871/sqlalchemy-exc-interfaceerror-in-flask) प्रश्न। मैंने ** QuerySelectField ** का उपयोग किया और यह एक त्रुटि उठाता है। मुझे नहीं पता कि इसे कैसे ठीक किया जाए। धन्यवाद – Max

3

एक संभावित समस्या यह है कि wtforms.ext.sqlalchemy.fields.QuerySelectField एक SQLLAchemy क्वेरी ऑब्जेक्ट की अपेक्षा करता है, भौतिक सूची नहीं। बस अपने possible_book वापसी से all() कॉल को दूर करने के लिए एक WTForms unmaterialized क्वेरी वापस जाने के लिए:

def possible_book(): 
    return Book.query.with_entities(Book.id) 
+0

मैंने कोशिश की, और ऐसा लगता है कि समस्या को हल नहीं किया जा रहा है। मुझे अभी भी एक ही त्रुटि है। मुझे लगता है कि मुझे प्रत्येक क्वेरी परिणाम को एक टुपल (मैप किए गए टुपल के बारे में डीबबगर टॉक ...) में रखना चाहिए, लेकिन मुझे नहीं पता कि न तो इसका सही तरीके से उपयोग कैसे किया जाए! Book.query का उपयोग करके – 22decembre

संबंधित मुद्दे