我有一个带有表组织的数据库和另一个表站点.如何使用 Flask-WTF 将创建的新站点映射到组织



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

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

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

App.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')

Models.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>

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

在脚本中尝试此操作

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>

最新更新