【问题标题】:I have a db with table Organisations and another table Sites. How can I use Flask-WTF map new sites created to an organisation我有一个带有表组织和另一个表站点的数据库。如何使用 Flask-WTF 将创建的新站点映射到组织
【发布时间】:2019-06-12 09:49:55
【问题描述】:

我创建了一对多关系,但我不确定如何发布从下拉菜单中选择的组织以及已创建的新站点详细信息。

基本页面布局将包含已创建并存储在数据库组织表中的组织名称的下拉列表。最终用户选择一个组织,然后输入站点的新名称并单击提交。

代码如下,任何帮助将不胜感激。

应用程序.py


@app.route('/add_site')
def add_site():
    """ Find and show field from db for the user to fill in """

    form = AddSite()
    organisations = db.session.query(Organisation)
    return render_template('add_site.html', form=form, 
    organisations=organisations)


@app.route('/insert_site', methods=['GET', 'POST'])
def insert_site():
    """ Insert populated fills from add_site to db """

    form = AddSite()
    site_name = Site(site_name=form.site_name.data)
    db.session.add(site_name)
    db.session.commit()
    return redirect(url_for('get_org'))

forms.py

class AddSite(FlaskForm):
    """ Adding new site """

    site_name = StringField('Site Name', validators=[DataRequired()])
    submit = SubmitField('Add Site')

模型.py

class Organisation(db.Model):
    """ Table to store organisation details """

    id = db.Column(db.Integer, primary_key=True, index=True, 
    unique=True)
    org_name = db.Column(db.String())
    timestamp = db.Column(db.DateTime, index=True, 
    default=datetime.utcnow)
    sites = db.relationship('Site', backref='org_name', lazy='dynamic')

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


class Site(db.Model):
    """ Table to store site details """

    id = db.Column(db.Integer, primary_key=True)
    site_name = db.Column(db.String())
    timestamp = db.Column(db.DateTime, index=True, 
    default=datetime.utcnow)
    org_id = db.Column(db.Integer, db.ForeignKey('organisation.id'))

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

add_site.html

<form action=" {{url_for('insert_site') }}" method="POST" class="col-12">
    {{ form.hidden_tag() }}

      <div class="col s12">

        <select name="organisation_list">
          <option value="" disabled selected>Choose an 
            Organisation</option>
            {% for org in organisations %}
            <option value ="{{org.org_name}}">{{org.org_name}}</option>
            {% endfor %}
        </select>

        <label>Organisations</label>
      </div>

    <div class="row">
        <div class="col s12">
            {{ form.site_name.label }}
            {{ form.site_name(size=32) }}
        </div>
    </div>

    <div class="row">
        <buttom>
            {{ form.submit() }}
        </buttom>
    </div>
</form>

最终结果是将多个站点映射到一个组织。这样我就可以创建一个页面来显示一个组织下的所有网站。

【问题讨论】:

  • 你的问题不太清楚你到底想做什么以及你需要如何帮助。
  • html 页面在下拉菜单中显示组织列表。当我去添加一个新站点时,我不确定如何在提交表单时将下拉菜单中选择的组织的数据传回数据库,以说明该站点已链接到该组织。我已经在models.py中的两个表之间建立了一对多的关系,但是当我添加一个新站点时,org_id列只显示null,而它应该显示在中选择的组织的ID下拉菜单。希望这是有道理的!
  • 你试过我的解决方案了吗?
  • @kellymandem 是的,非常感谢您提供的脚本。但是现在 HTML 部分遇到了麻烦。如何在下拉菜单中显示每个组织?抱歉,对 Python 和 Flask 非常陌生,仍然需要大量学习。

标签: python-3.x flask flask-sqlalchemy flask-wtforms


【解决方案1】:

在你的脚本中试试这个

App.py

from flask import (request, render_template, redirect_url,
                   url_for)
from app.Models import db, Site  # Use proper import here for your app


@app.route('/add_site', methods=['GET', 'POST'])
def add_site():
    form = AddSite(request.form)
    if request.method == 'POST' and form.validate():
        site = Site(
            site_name=form.site_name.data,
            org_id=form.organisation.data
        )
        db.session.add(site)
        db.session.commit()
        return redirect(url_for('get_org'))
    return render_template('add_site.html', form=form)

forms.py

from flask_wtf import FlaskForm as Form
from wtforms import (SelectField, StringField, SubmitField)
from wtforms.validators import DataRequired as Required
from app.Models import Organisation  # Use proper import here for your app


class AddSite(Form):
    """ Adding new site """

    site_name = StringField('Site Name',
                            validators=[Required('Site name is required')])
    organisation = SelectField('Organisation', coerce=int,
                               validators=[
                                   Required('Please select an organisation')])
    submit = SubmitField('Add Site')

    def __init__(self, *args, **kwargs):
        super(AddSite, self).__init__(*args, **kwargs)
        organisations = Organisation.query.with_entities(
            Organisation.id, Organisation.org_name). \
            order_by(Organisation.org_name).all()
        self.organisation.choices = [
            (organisation.id, organisation.org_name)
            for organisation in organisations
        ]

Models.py

class Organisation(db.Model):
    """ Table to store organisation details """

    __tablename__ = 'organisation'

    id = db.Column(db.Integer, primary_key=True)
    org_name = db.Column(db.String(100))
    timestamp = db.Column(db.DateTime, index=True,
                          default=datetime.utcnow)
    sites = db.relationship('Site', backref='organisation', lazy='dynamic')

    def __repr__(self):
        return '<Organisation: {!r}'.format(self.org_name)


class Site(db.Model):
    """ Table to store site details """

    __tablename__ = 'site'

    id = db.Column(db.Integer, primary_key=True)
    site_name = db.Column(db.String())
    timestamp = db.Column(db.DateTime, index=True,
                          default=datetime.utcnow)
    org_id = db.Column(db.Integer, db.ForeignKey('organisation.id'))

    def __repr__(self):
        return '<Site: {!r}'.format(self.site_name)

add_site.html

<form action=" {{url_for('add_site') }}" method="POST">
    <div class="form-group{% if form.site_name.errors %} has-error{% endif %}">
        {{ form.site_name.label(for_='site_name') }}
        {{ form.site_name(class='form-control') }}
        {% if form.site_name.errors %}
            <span class="help-block">{{ form.site_name.errors[0] }}</span>
        {% endif %}
    </div>
    <div class="form-group{% if form.organisation.errors %} has-error{% endif %}">
        {{ form.organisation.label }}
        {{ form.organisation(class='form-control') }}
    </div>
    {{ form.csrf_token }}
    {{ form.submit(class='btn btn-default', value='Add Site') }}
</form>

【讨论】:

  • 非常感谢您提供的脚本。现在 HTML 部分有问题。如何在下拉菜单中显示每个组织?抱歉,对 Python 和 Flask 非常陌生,仍然需要大量学习。
  • @tony25225 只需将forms.pyadd_site.html 中的代码更改为我给您的代码,一切都会正常运行,并确保您根据项目设置使用正确的语句。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-09
  • 1970-01-01
  • 1970-01-01
  • 2019-10-10
  • 1970-01-01
  • 2019-12-28
  • 2012-09-28
相关资源
最近更新 更多