【问题标题】:Add entry to Select Field Flask WTForms向 Select Field Flask WTForms 添加条目
【发布时间】:2017-03-05 18:11:37
【问题描述】:

我有以下数据库模型:

class FlashcardCollection(db.Model):
    __tablename__ = 'flashcardcollection'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), index=True)
    timestamp = db.Column(db.DateTime, index=True, default=datetime.utcnow)
    user_id = db.Column(db.Integer, db.ForeignKey('users.id'))
    flashcards = db.relationship('Flashcard', backref='collection', lazy='dynamic')
    categories = db.relationship('Category',
                             secondary=has_category,
                             backref=db.backref('collections', lazy='dynamic'),
                             lazy='dynamic')

class Category(db.Model):
    __tablename__ = 'category'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), unique=True, index=True)

has_category = db.Table('has_category',
                    db.Column('category_id', db.Integer, db.ForeignKey('category.id')),
                    db.Column('flashcardcollection_id', db.Integer, db.ForeignKey('flashcardcollection.id')))

我有以下表单类:

class FlashcardCollectionForm(FlaskForm):
    name = StringField('Collection name', validators=[DataRequired()])
    category = SelectField('Category', choices=[])
    submit = SubmitField('Add')

通过这个表格,我将添加一个新的抽认卡集合。我还将允许用户在创建集合时为抽认卡集合添加一个新类别。

查看函数如下(现在什么都没做)

@main.route('/add-collection', methods=['GET', 'POST'])
@login_required
def add_collection():
   form = FlashcardCollectionForm()
   if form.validate_on_submit():
       flash('Flashcard Collection added.')
       return redirect(url_for('.index'))
   return render_template('add_collection.html', form=form)

在此视图函数中,将创建新的 Flashcardcollection 并将其添加到数据库中。

这是模板:

{% block page_content %}
    <div class="page-header">
        <h1>Add a new Flashcard Collection</h1>
    </div>
    <div class="col-md-4">

        <form action="#" method="post">
            {{ form.csrf_token }}
            {{ form.name.label }} {{ form.name(size=20) }}
            {{ form.category.label }} {{ form.category(id="test") }}
            <button>Add</button>
            <input type="submit" value="Go">
        </form>
    </div>
{% endblock %}

单击添加按钮应提示用户输入新类别。然后应将此类别添加到数据库并显示在选择字段中。 单击提交按钮应将抽认卡集合添加到数据库中。

问题是第一部分。如何在创建新的抽认卡集合时动态添加新类别?有没有没有 Javascript 的解决方案,或者我应该使用 javascript。如果是,函数的外观如何?

【问题讨论】:

    标签: python flask flask-sqlalchemy wtforms flask-wtforms


    【解决方案1】:

    使用flask_sqlalchemy 可以轻松创建模型并填充选择标签。接下来将__init__ 方法添加到表单类以从数据库中填充值:

    class FlashcardCollectionForm(FlaskForm):
        ...
        def __init__(self, *args, **kwargs):
            super(FlashcardCollectionForm, self).__init__(*args, **kwargs)
            self.category.choices = [(card.id)(card.category) for card in Card.query.all()]
    

    使用__init__,我们为选择字段设置选项都来自数据库。 最后,保存条目:

    def add_collection():
       form = FlashcardCollectionForm()
       if request.method == 'POST':
           c = Category(name=form.name.data)
           f = FlashcardCollection(...)
           has_category(category_id=c.id, flashcardcollection_id=f.id)
           db.session.add_all([c, f])
           db.session.commit()
    

    【讨论】:

    • 感谢您的回答。我已经编辑了问题并添加了一些附加信息来解决问题。我想在创建与类别具有外键关系的数据库对象时动态添加新类别。
    • 在 if 块中创建一个 Category 实例 while 方法是 post 并传递表单数据作为它的参数,然后使用这个 category 实例
    猜你喜欢
    • 1970-01-01
    • 2018-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多