У меня есть БД с таблицей организаций и другой таблицы сайтов. Как я могу использовать Flask-WTF отображать новые сайты, созданные для организации - PullRequest
0 голосов
/ 12 июня 2019

У меня создано отношение «один ко многим», но я не уверен, как я могу опубликовать организацию, которая была выбрана из выпадающего меню, с новыми деталями сайта, которые были созданы.

Будет развернут базовый макет страницы с именами организаций, которые уже были созданы и сохранены в таблице организации в БД. Конечный пользователь выбирает организацию, затем вводит новое имя для сайта и нажимает кнопку «Отправить».

Код ниже и любая помощь будет оценена по достоинству.

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>

Конечным результатом является сопоставление нескольких сайтов с организацией. Это так, я могу создать страницу, которая покажет все сайты, которые находятся в организации.

1 Ответ

0 голосов
/ 12 июня 2019

Попробуйте это в своих скриптах

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