2014-04-08 8 views
8

का उपयोग करने वाला एक पूर्ण-से-वन उदाहरण यहां मेरा HTML ड्रॉपडाउन मेनू है। मूल्य बाल तालिका की प्राथमिक कुंजी है।फ्लास्क, डब्ल्यूटीएफओएम, एसक्यूएलकेमी, और जिनजा 2

<select id="category" name="category"> 
    <option selected value="__None"></option> 
    <option value="1">Category Number One</option> 
    <option value="2">Category Number Two</option> 
</select> 

मुझे "श्रेणी संख्या वन" के बजाय मूल्य पूर्णांक 1 के साथ Post.category_id अद्यतन करने की आवश्यकता है। मेरा कोड यहाँ है।

# create new post 
@app.route('/admin/post', methods=['GET', 'POST']) 
@login_required # Required for Flask-Security 
def create_post(): 
    form = PostForm() 
    if form.validate_on_submit(): 
     post = Post(title=form.title.data, 
        body=form.body.data, 
        pub_date=form.pub_date.data, 
        cateogry_id=form.category.data) 
     db.session.add(post) 
     db.session.commit() 
     flash('Your post has been published.') 
     return redirect(url_for('admin')) 
    posts = Post.query.all() 
    return render_template('create_post.html', form=form, posts=posts) 

मैं बनाने की कोशिश की है ...

cateogry_id=form.category.data 
cateogry_id=form.category.value 

अब जब कि अच्छा नहीं होगा!

+0

मैंने इस मुद्दे को हल किया ... मैं डब्ल्यूटी फॉर्म्स क्वेरीरीइलेफ़िल्फ़ का उपयोग कर रहा हूं इसलिए मेरी गलती सोच रही थी कि मुझे श्रेणी_आईडी फ़ील्ड को जिजा 2 टेम्पलेट में जोड़ने की ज़रूरत है .... डब्ल्यूटीएफ एक्सटेंशन आपके लिए यह सब कुछ संभालता है। तो ... आपको केवल श्रेणी क्षेत्र के बारे में चिंता करना है। यह दृश्य, टेम्पलेट और मॉडल के लिए जाता है। – jwogrady

उत्तर

7

मैंने इसे समझ लिया! मेरा समाधान यहाँ है। उम्मीद है कि यह लेखन अगले व्यक्ति की मदद करेगा।

समाधान विस्तार आपके लिए काम करने देना है! फ्लास्क, डब्ल्यूटीएफओएम, एसक्यूएलकेमी और जिनजा 2 का उपयोग करते हुए डब्ल्यूटी फॉर्म्स एसक्लैल्केमी एक्सटेंशन का एक कामकाजी उदाहरण यहां दिया गया है। संक्षेप में, आपको बच्चे आईडी के बारे में चिंता करने की आवश्यकता नहीं है क्योंकि एक्सटेंशन स्वचालित रूप से इसका ख्याल रखता है। इसका मतलब है कि जब आप एक से अधिक रिश्ते में स्क्लेक्लेमी माता-पिता और बाल मॉडल से निपटते हैं तो आपको केवल माता-पिता से निपटना होगा।

मॉडल

सबसे पहले, सुनिश्चित करें कि आपके मॉडल बनाने के लिए और रिश्तों सही हैं। मेरे उदाहरण में नोटिस कैसे रिश्तों को परिभाषित किया गया है और मॉडल के init में केवल CATEGORY है ... CATEGORY_ID नहीं। मेरी गलती सोच रही थी कि मेरे मॉडल के CATEGORY_ID फ़ील्ड को पॉप्युलेट करना होगा। नहीं। विस्तार आपके लिए करता है। वास्तव में, यदि आप मैन्युअल रूप से ऐसा करने के लिए की तरह मैंने किया था की कोशिश यह बिल्कुल काम नहीं ....

class Post(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    title = db.Column(db.String(80)) 
    url = db.Column(db.String(120)) 
    body = db.Column(db.Text) 
    create_date = db.Column(db.DateTime) 
    pub_date = db.Column(db.DateTime) 
    pub_status = db.Column(db.Text(80)) 
    author_id = db.Column(db.Integer, db.ForeignKey('user.id')) 
    author = db.relationship('User', 
          backref=db.backref('posts', lazy='dynamic')) 
    category_id = db.Column(db.Integer, db.ForeignKey('category.id')) 
    category = db.relationship('Category', 
           backref=db.backref('posts', lazy='dynamic')) 

    def __init__(self, title, body, category, pub_date=None): 
     self.title = title 
     self.body = body 
     if pub_date is None: 
      pub_date = datetime.utcnow() 
     self.category = category 
     self.pub_date = pub_date 

    def __repr__(self): 
     return '<Post %r>' % self.title 

class Category(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.String(50)) 
    description = db.Column(db.String(250)) 

    def __init__(self, name): 
     self.name = name 

    def __repr__(self): 
     return self.name 

दूसरा, प्रपत्र की जाँच .... सूचना मैंने QuerySelectedField sqlalchmey wtfrom उपयोग कर रहा हूँ और category_id क्षेत्र अनुपस्थित है ...

फार्म

from sprucepress.models import Tag, Category 
from flask_wtf import Form 
from wtforms.fields import StringField, DateTimeField 
from wtforms.widgets import TextArea 
from wtforms.validators import DataRequired 
from wtforms.ext.sqlalchemy.orm import model_form 
from wtforms.ext.sqlalchemy.fields import QuerySelectField 


def enabled_categories(): 
    return Category.query.all() 


class PostForm(Form): 
    title = StringField(u'title', validators=[DataRequired()]) 
    body = StringField(u'Text', widget=TextArea()) 
    pub_date = DateTimeField(u'date create') 
    category = QuerySelectField(query_factory=enabled_categories, 
           allow_blank=True) 

अब फ्लास्क मार्ग और देखने तर्क ... पोस्ट में सूचना नहीं फिर category_id! केवल श्रेणी केवल !!!

अनुमार्गण/देखें

# create new post 
@app.route('/admin/post', methods=['GET', 'POST']) 
@login_required # required for Flask-Security 
def create_post(): 
    form = PostForm() 
    if form.validate_on_submit(): 
     post = Post(title=form.title.data, pub_date=form.pub_date.data, 
        body=form.body.data, category=form.category.data) 
     db.session.add(post) 
     db.session.commit() 
     flash('Your post has been published.') 
     return redirect(url_for('admin')) 
    posts = Post.query.all() 
    return render_template('create_post.html', form=form, posts=posts) 

अंत में, टेम्पलेट। मान लीजिए, हम केवल form.category फ़ील्ड उत्पन्न करते हैं !!!

खाका

<form action="" method=post> 
    {{form.hidden_tag()}} 
    <dl> 
     <dt>Title: 
     <dd>{{ form.title }} 
     <dt>Post: 
     <dd>{{ form.body(cols="35", rows="20") }} 
     <dt>Category: 
     <dd>{{ form.category }} 

    </dl> 
    <p> 
     <input type=submit value="Publish"> 
    </form> 

परिणाम ... इस समाधान सही ढंग से एक लुकअप तालिका के रूप में श्रेणी मॉडल का उपयोग करता है और पोस्ट category_id क्षेत्र के लिए श्रेणी पी पूर्णांकों लिख कर सही ढंग से पोस्ट पंक्तियों एकत्रित करती है। Yeeeehaww!

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