Я изменяю свое приложение, включив в него wtforms-alchemy, как это выглядит из документов https://wtforms -alchemy.readthedocs.io / en / latest / ввод.html как более простых, я удалил вниз мой код к основам, так что, если я получаю какие-либо ошибки, я могу найти его быстрее, проблема в фрагменте кода, который должен использоваться для работы wtforms-alchemy с флягой, вот ссылка https://wtforms - alchemy.readthedocs.io/en/latest/advanced.html
когда я удаляю этот фрагмент, я не могу инициализировать базу данных, так как класс ModelForm не распознается, и поэтому я хочу перенести его. В документах говорится, что требуется только фрагмент, но мне интересно, если это моя основная __init__.py
настройка, которая неверна.
приложение __init__.py
import os
import RPi.GPIO as GPIO
from flask import Flask, request, current_app
from config import Config
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
from flask_login import LoginManager
from flask_bootstrap import Bootstrap
from flask_mail import Mail
from flask_wtf import FlaskForm
from wtforms_alchemy import model_form_factory
db = SQLAlchemy()
migrate = Migrate()
login = LoginManager()
login.login_view = 'auth.login'
login.login_message = 'Please log in to access this page.'
mail = Mail()
bootstrap = Bootstrap()
def create_app(test_config=None):
# create and configure the app
app = Flask(__name__, instance_relative_config=True)
app.config.from_object(Config)
db.init_app(app)
migrate.init_app(app, db)
login.init_app(app)
bootstrap.init_app(app)
mail.init_app(app)
from homeHeating.auth import bp as auth_bp
app.register_blueprint(auth_bp)
control.py
from homeHeating import db
from homeHeating.control.forms import AddPinForm
from homeHeating.models import User, Pins
from homeHeating.control import bp
from mySensorModule import read_sensor
import time
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
@bp.route('/', methods=['GET', 'POST'])
@bp.route('/index', methods=['GET', 'POST'])
@login_required
def index():
pins = Pins.query.all()
for pin in pins:
GPIO.setup(pin.pin, GPIO.OUT)
pin.state = GPIO.input(pin.pin)
db.session.commit()
templateData = {
'pins' : pins
}
return render_template('control/index.html', **templateData)
forms.py
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField, SelectField
from wtforms.validators import ValidationError, DataRequired, Email,
EqualTo
from homeHeating.models import User, Pins
from wtforms_alchemy.fields import QuerySelectField
from wtforms_alchemy import model_form_factory
BaseModelForm = model_form_factory(FlaskForm)
class ModelForm(BaseModelForm):
@classmethod
def get_session(self): #this part is the problem
return db.session
class AddPinForm(ModelForm):
class Meta:
model = Pins
def validate_Name(self, name):
pins = Pins.query.filter_by(pin=name.data).first()
if pins is not None:
raise ValidationError('Please use a different name.')
ERROR
File "/home/pi/heating/homeHeating/__init__.py", line 38, in create_app
app.register_blueprint(control_bp)
raise LookupError('the converter %r does not exist' % converter_name)
LookupError: the converter 'init' does not exist
Я ожидаю, что смогу инициализировать базу данных с этим, как описано в документации, я думаю, что ошибка в моем файле init .py, где я, вероятно, использую настройку для sqlalchemy , Но это за мной! код ошибки должен быть длинным, но я включил две строки, которые, как мне кажется, указывают на проблему.
Заранее извиняюсь, если кода много или недостаточно, пожалуйста, спросите, хотите ли вы больше.
С уважением, Павел
EDIT
Я забыл добавить 'models.py'
models.py
from homeheating import db, login
from datetime import datetime
from time import time
from flask import current_app
from flask_wtf import FlaskForm
class Pins(db.Model):
id = db.Column(db.Integer, primary_key=True)
pin = db.Column(db.Integer, index=True, unique=True)
name = db.Column(db.String(64))
upDown = db.Column(db.String(4))
state = db.Column(db.String(9))
def __repr__(self):
return '<Pins {}>'.format(self.pin)
EDIT2
Прошу прощения, я не включил весь код в «control.py», после того, как поиграл с этим кодом сегодня утром, я обнаружил, что следующая функция может быть проблемой. Это то, что я сделал. Я переместил фрагмент из «forms.py» в «models.py» и добавил «ModelForm» к импорту в формах (т.е. из homeHeating.models import ModelForm, ...).
так, чтобы нарушить (возможно) код в 'control.py'
control.py
@bp.route('/control/addpin/<init:id>', methods=['GET', 'POST'])
@login_required
def add_or_edit_pin(id=None):
obj = Pins.query.get_or_404(id)
form = AddPinForm(request.form, obj=obj)
if form.validate_on_submit():
form.populate_obj(obj)
db.session.add(obj)
db.session.commit()
flash('Congratulations, you have now a registered a device!')
return redirect(url_for('control.addpin'))
return render_template('control/addpin.html', title='Add pin',
form=form)
Это хорошая новость, поскольку я могу использовать wtforms-alchemy, но плохая новость, поскольку эта функция add_edit полностью соответствует моим планам, поскольку я хочу использовать эту модель для каждой формы !!!
PS. Этот код от помощи здесь в другом из моих вопросов и на сайте wtforms-alchemy.