実現したいこと
現在Flaskにて管理画面の作成を行なっております。
管理画面にて「お知らせ」を投稿した際に、current_userのidを取得してNewsテーブルに紐付けて格納したいのですが、上手く出来ません。
printにて確認したところ、current_user.id自体は取得出来ているようなのですが、<User 1>ではなく、user_idのみを取得するにはどのように指定すると良いでしょうか。。
補足情報(FW/ツールのバージョンなど)
・macOS Monterey : 12.4
・amazon liunx2 : t2.micro
・Python : 3.7.10
・Flask : 2.1.2
・Flask-SQLAlchemy : 2.5.1
・SQLAlchemy : 1.4.39
階層構造
- project名/
- app.py
- database.py
- config.py
- views/
- project名_view.py
- models/
- init.py
- models.py
- templates/
- static/
発生している問題・エラーメッセージ
<User 1> # ↑printにてcurrent_user.idを出力しております。 sqlalchemy.exc.DataError: (pymysql.err.DataError) (1366, "Incorrect integer value: '<User 1>' for column 'user_id' at row 1") [SQL: INSERT INTO news (title, start_on, registered_date, content, user_id) VALUES (%(title)s, %(start_on)s, %(registered_date)s, %(content)s, %(user_id)s)] [parameters: {'title': 'サンプルタイトル', 'start_on': '2022-07-18T16:00', 'registered_date': datetime.datetime(2022, 7, 18, 7, 6, 40, 325065), 'content': 'TestText_SampleText_SampleText_SampleText_SampleText_SampleText_SampleText_SampleText_SampleText_SampleText_SampleText_SampleText_SampleText_SampleText_SampleText_SampleText_SampleText_SampleText_SampleText_SampleText_SampleText', 'user_id': <User 1>}] (Background on this error at: https://sqlalche.me/e/14/9h9h)
該当のソースコード
app.py
from flask import Flask from views import project名_view from database import db, login_manager import os import models import config def create_app(): app = Flask(__name__) app.config.from_object('config.Config') app.config['SECRET_KEY'] = os.urandom(24) db.init_app(app) login_manager.init_app(app) app.register_blueprint(project名_view.app) return app app = create_app() with app.app_context(): db.create_all() if __name__ == "__main__": app.run(host='0.0.0.0', debug=True)
views/project名_view.py
from flask import Blueprint, render_template, request, redirect, url_for, session from flask_login import current_user from werkzeug.security import generate_password_hash, check_password_hash from database import db, login_manager, login_user, logout_user, login_required from models import Contact, User, News import datetime app = Blueprint('views', __name__) # 中略 @app.route('/news_create', methods=['GET', 'POST']) def news_create(): if request.method == 'POST': title = request.form.get('title') start_on = request.form.get('start_on') registered_date = datetime.datetime.now() content = request.form.get('content') user_id = User.query.get(current_user.id) print(user_id) news = News(title=title, start_on=start_on, registered_date=registered_date, content=content, user_id=user_id) db.session.add(news) db.session.commit() return redirect('/admin') else: title = "プロジェクト名|お知らせ投稿" return render_template('admin_news_create.html', title=title)
templates/admin_news_create.html
{% extends 'application.html' %} {% block body %} <section class="admin"> {% include 'admin_nav.html' %} <div class="right_content"> {% include 'admin_header.html' %} <div class="admin_contents"> <div class="admin_title"> <h2>お知らせ投稿</h2> <form id="admin_news_form" method="POST" action="/news_create"> <div class="admin_news_form"> <label>タイトル<span class="mandatory">必須</span></label><br> <input type="text" name="title" placeholder: "最大入力20文字"> </div> <div class="admin_news_form news_edit_form admin_news_date"> <label>掲載開始日<span class="mandatory">必須</span></label><br> <input type="datetime-local" name="start_on"> </div> <div class="admin_news_form"> <label>お知らせ詳細<span class="mandatory">必須</span></label><br> <input type="text" name="content"> </div> <div class="admin_news_submit"> <input type="submit" value="投稿"> </div> </form> </div> </div> {% include 'admin_footer.html' %} </div> </section> {% endblock %}
models/models.py
from database import db, UserMixin import datetime # 中略 class User(UserMixin, db.Model): __tablename__ = 'users' id = db.Column(db.Integer, primary_key=True) user_name = db.Column(db.String(30), nullable=True, unique=True) email = db.Column(db.String(300), nullable=True, unique=True) password = db.Column(db.String(300), nullable=True) password_confirmation = db.Column(db.String(300), nullable=True) first_name = db.Column(db.String(30), nullable=True) last_name = db.Column(db.String(30), nullable=True) news = db.relationship('News', backref='users') class News(db.Model): __tablename__ = 'news' id = db.Column(db.Integer, primary_key=True) title = db.Column(db.String(60), nullable=True, unique=True) start_on = db.Column(db.DateTime, nullable=True) registered_date = db.Column(db.DateTime, default=datetime.datetime.utcnow) content = db.Column(db.Text, nullable=True) user_id = db.Column(db.Integer, db.ForeignKey('users.id'))
試したこと
current_user.idを取得できるように、様々なサイトを参考に試行錯誤しているのですが、解決にはいたりませんでした。
指定方法によっては投稿した際にエラーが出ず、投稿できるのですが、Newsテーブルのuser_idがNULLになってしまいます。
上記の提示しているコードが一番解決に近いのですが、後一歩のところで苦戦しております。。
※user_idを取得せず(一対多の関係にしなかった場合)投稿した際には、問題なく投稿は出来ている状態でした。
本件、お分かりの方がいらっしゃいましたらご教授頂けますと幸いです。
その他に必要な情報等がありましたら提示いたします。
よろしくお願いいたします。
0 コメント