93404


Flask、SQLiteでFlaskの学習を行っております。  
def update()で記事の編集処理を記載していますが、  
記事を編集し、changeボタンを押すと、404エラー画面が表示され  
DBにも変更内容が反映されていません。

昨日から、何回も書き直し、見直しを行っていますが、  
下記コードで、どこが間違っているのか見当がつかない状況です。  
どなたかご教示お願い致します。

その他、create、deleteの処理は問題なくできております。

[code]

    <!-- index.html -->
    {% extends 'base.html' %}
    
    {% block content %}
    <h1>Top</h1>
    
    {% for post in posts %}
    <h2>タイトル： {{post.title}}</h2>
    <p>期限： {{post.due.date()}}</p>
    
    <a href="detail/{{ post.id }}" role="button">詳細</a>
    <a href="update/{{ post.id }}" role="button">変更</a>
    <a href="delete/{{ post.id }}" role="button">削除</a>
    {% endfor %}
    
    {% endblock %}
    
    
[/code]

[code]

    # app.py
    
    from datetime import datetime
    
    from flask import Flask, render_template, request, redirect
    from flask_sqlalchemy import SQLAlchemy
    
    app = Flask(__name__)
    URI = 'sqlite:///todo.db'
    app.config['SQLALCHEMY_DATABASE_URI'] = URI
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
    db = SQLAlchemy(app)
    
    class Post(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        title = db.Column(db.String(140), nullable=False)
        detail = db.Column(db.String(100))
        due = db.Column(db.DateTime, nullable=False)
    
    @app.route('/', methods=['GET', 'POST'])
    def index():
        if request.method == 'GET':
            posts = Post.query.all()
            return render_template('index.html', posts=posts)
        else:
            title = request.form.get('title')
            detail = request.form.get('detail')
            due = request.form.get('due')
    
            due = datetime.strptime(due, '%Y-%m-%d')
    
            new_post = Post(title=title, detail=detail, due=due)
            db.session.add(new_post)
            db.session.commit()
    
            return redirect('/')
    
    @app.route('/create')
    def create():
        return render_template('create.html')
    
    
    @app.route('/detail/<int:id>')
    def read(id):
        post = Post.query.get(id)
        return render_template('detail.html', post=post)
    
    
    @app.route('/update/<int:id>', methods=['GET', 'POST'])
    def update(id):
        post = Post.query.get(id)
        if request.method == 'GET':
            return render_template('update.html', post=post)
        else:
            post.title = request.form.get('title')
            post.detail = request.form.get('detail')
            post.due = datetime.strptime(request.form.get('due'), '%Y-%m-%d')
    
            db.session.commit()
    
            return redirect('/')
    
    @app.route('/delete/<int:id>')
    def delete(id):
        post = Post.query.get(id)
    
        db.session.delete(post)
        db.session.commit()
        return redirect('/')
    
    if __name__ == '__main__':
        app.run(debug=True)
    
    
[/code]

[code]

    <!-- update.html -->
    
    {% extends 'base.html' %}
    
    {% block content %}
    <form action="update/{{ post.id }}" method="POST">
        <label for="title">Title</label>
        <input type="text" name="title" value="{{ post.title }}">
        <label for="detail">Detail</label>
        <input type="text" name="detail" value="{{ post.detail }}">
        <label for="due">Due</label>
        <input type="date" name="due" value="{{ post.due.date() }}" required>
        <input type="submit" value="Change">
    </form>
    {% endblock %}
    
[/code]

[![画像の説明をここに入力](https://i.stack.imgur.com/Jhmel.png)](https://i.stack.imgur.com/Jhmel.png)

「change」ボタン押下後  
[![画像の説明をここに入力](https://i.stack.imgur.com/jsTSd.png)](https://i.stack.imgur.com/jsTSd.png)


CC BY-SA 4.0
2023-01-15T07:06:00.503
93354
2023-01-17T08:09:46.470
2023-01-15T07:47:09.590
question
python python3 sqlite flask
Flask　記事の編集／DBへ反映が行われない


ご指摘の通り、update.htmlのactionをaction="/update/{{ post.id }}"とすることでできました。


CC BY-SA 4.0
2023-01-17T08:09:46.470
93404
2023-01-17T08:09:46.470
93354
answer