Регистрация данных из нескольких WTForms в базе данных sqlite3 в Flask -Sqlalchemy - PullRequest
0 голосов
/ 24 января 2020

ОК, пожалуйста, помогите. Я дергаю себя за волосы, хотя знаю, что ответ ДОЛЖЕН быть чем-то простым.

В моем проекте веб-интерфейса Flask -SQLAlchemy есть две формы: Post и Survey.

Сообщение было первой страницей, которую я создал, чтобы убедиться, что я могу эффективно писать в базу данных. Он расположен на главной странице / странице индекса. Ведение журнала данных с домашней страницы с использованием класса Post - это то, что я могу успешно сделать.

После создания Post я захотел создать свою первую форму для своего проекта. Эта форма / класс называется Survey. Таблица опросов существует в моей базе данных; Я успешно создал все нужные мне столбцы и перенес таблицу. Я также могу увидеть Опрос на моей веб-странице.

Top Bar from the Home screen showing Survey

Итак, давайте перейдем к опросу, и, конечно же, моя форма там. enter image description here

Отлично. Хорошо, теперь давайте добавим некоторые данные.

enter image description here

Я нажимаю "Отправить", и веб-страница автоматически возвращается на домашний / индексный экран с флагом sh сообщение «Ваше сообщение сейчас в сети!», отправленное из формы «Пост», а не формы «Опрос». В терминале появляется следующий код:

127.0.0.1 - - [24/Jan/2020 14:59:40] "POST / HTTP/1.1" 302 -
127.0.0.1 - - [24/Jan/2020 14:59:40] "GET /index HTTP/1.1" 200 -

Что похоже на вывод, который я получаю, когда использую форму Post. Тем не менее, ничего не было сохранено в моей таблице Survey в базе данных.

>>> Survey.query.all()
[]

Я могу добавлять вещи в свою таблицу Post, пока у меня не посинет лицо, но таблица Survey, похоже, не работает , Теперь я уверен, что это что-то глупое. Например, мне нужно по-другому пометить свои кнопки отправки, или, возможно, у меня не должно быть формы на странице индекса, если я хочу использовать другие формы, или я пропустил привязку кода обратно к домашней странице, КУДА-ТО, хотя я искал этот код в течение нескольких дней, и я не могу его найти.

Помогите? Моя конечная игра - добавить много этих таблиц, чтобы помочь управлять довольно здоровенной базой данных с множеством таблиц и взаимосвязей. Я не могу сказать, что я полон уверенности, если мне не удастся получить две формы для хорошей игры.

Большая часть кода входа была удалена снизу, так как это работает просто хорошо.

__ init__py:

from flask import Flask, render_template, request, redirect
from config import Config
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
from flask_login import LoginManager

app = Flask(__name__)
app.config.from_object(Config)
db = SQLAlchemy(app)
migrate=Migrate(app,db)
login = LoginManager(app)
login.login_view = 'login'

from app import routes, models

forms.py:

from flask_wtf import FlaskForm
from wtforms import StringField,PasswordField,BooleanField,SubmitField, TextAreaField, DateField
from wtforms.validators import DataRequired, Length

class PostForm(FlaskForm):
    post = TextAreaField('Say something')
    submit = SubmitField('Submit')

class SurveyForm(FlaskForm):
    surveyname=StringField('Survey Name', validators=[DataRequired()])
    surveycode=StringField('Survey Code', validators=[DataRequired()])
    embark=DateField('Date Embark: format=yyyy-mm-dd')
    dock=DateField('Date Return: format=yyyy-mm-dd')
    vessel=StringField('Vessel Name')
    submit=SubmitField('Submit')

rout.py:

from flask import render_template, flash, request, redirect, url_for
from flask_sqlalchemy import SQLAlchemy
from flask_login import current_user, login_user, logout_user, login_required
from werkzeug.urls import url_parse

from app import app, db
from app.models import User, Post, Survey
from app.forms import LoginForm, PostForm, SurveyForm


@app.route('/', methods=['GET','POST'])
@app.route('/index',methods=['GET','POST'])
@login_required
def index():
    form=PostForm()
    if form.validate_on_submit():
        post=Post(body=form.post.data, author=current_user)
        db.session.add(post)
        db.session.commit()
        flash('Your post is now live!')
        return redirect(url_for('index'))
    return render_template('index.html', title='Home',form=form)

@app.route('/survey', methods=["GET","POST"])
def survey():
    form=SurveyForm(request.form)
    if form.validate_on_submit():
        survey=Survey(surveyname=form.surveyname.data, 
            surveycode=form.surveycode.data, 
            embark=form.embark.data, 
            dock=form.dock.data, 
            vessel=form.vessel.data)                    
        db.session.add(survey)
        db.session.commit()
        return redirect(url_for('survey'))
    return render_template('survey.html', title='Survey', form=form)

models.py:

from datetime import datetime
from app import db, login

class Post(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    body = db.Column(db.String(140))
    timestamp = db.Column(db.DateTime, index=True, default=datetime.utcnow)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))

    def __repr__(self):
        return '<Post {}>'.format(self.body)

class Survey(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    surveyname = db.Column(db.String(140), nullable=False)
    surveycode = db.Column(db.String(140), nullable=False)
    embark = db.Column(db.DateTime, default=datetime.utcnow)
    dock = db.Column(db.DateTime, default=datetime.utcnow)
    vessel = db.Column(db.String(140))

    def __repr__(self):
        return '<Survey {}>'.format(self.surveycode)
...