Python Flask не удаляет правильный идентификатор из базы данных SQLAlchemy - PullRequest
0 голосов
/ 10 июня 2018

У меня есть таблица HTML, которая извлекает данные из базы данных SQLAlchemy.

В этой таблице для каждой строки у меня есть кнопка Delete, которая должна удалять эту строку и запись базы данных, когда я нажимаю наit.

Проблема, с которой я столкнулся, заключается в том, что, если я пытаюсь удалить любую строку в этой таблице, она удаляет только первую строку (см. изображение ниже) и связанные с ней данные в базе данных.

Строка и данные, которые я хотел удалить, остаются без изменений (3-я строка на рисунке ниже).

enter image description here

Если я нажмуDelete в первом ряду таблицы, работает без проблем.

Кнопка Update работает с отступом (обновляя правильную запись)

У меня есть модель базы данных:

class ActualPost(db.Model):
    __tablename__ = 'actualpost'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    title_actual = db.Column(db.String(30), nullable=False, default='actual')
    category_actual = db.Column(db.String(30), nullable=False, default=None)
    actual_amount_name = db.Column(db.String(30), nullable=True)
    actual_amount = db.Column(db.Float, nullable=False)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
    date_posted = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
    comments = db.Column(db.Text, nullable=True)

    def __repr__(self):
        return f"ActualPost('{self.title_actual}, '{self.category_actual}'\
        , '{self.actual_amount_name}', '{self.actual_amount}'\
        , '{self.date_posted}', '{self.comments}')"

Вот мои маршруты (Обновить иУдалить)

@posts.route("/post/<int:post_id>/update_actual", methods=['GET', 'POST'])
@login_required
def update_actual_post(post_id):
    post = ActualPost.query.get_or_404(post_id)
    if post.actual_author != current_user:
        abort(403)
    form = PostActualForm()
    if form.validate_on_submit():
        post.title_actual = form.title_actual.data
        post.category_actual = form.category_actual.data
        post.actual_amount_name = form.actual_amount_name.data.name
        post.actual_amount = form.actual_amount.data
        post.comments = form.comments.data
        db.session.commit()
        flash('Your post has been updated!', 'success')
        return redirect(url_for('main.actual', post_id=post.id))
    elif request.method == 'GET':
        form.title_actual.data = post.title_actual
        form.category_actual.data= post.category_actual
        form.actual_amount_name.data = post.actual_amount_name
        form.actual_amount.data = post.actual_amount
        form.comments.data = post.comments
    return render_template('create_actual_post.html', title='Update Actual',
                           form=form, legend='Update Actual')


@posts.route("/post/<int:post_id>/delete_actual", methods=['POST'])
@login_required
def delete_actual_post(post_id):
    post = ActualPost.query.get_or_404(post_id)
    if post.actual_author != current_user:
        abort(403)
    db.session.delete(post)
    db.session.commit()
    flash('Your post has been deleted!', 'success')
    return redirect(url_for('main.actual', post_id=post.id))

Это HTML-код, который я использую для кнопки Удалить:

<div class="modal-footer">
   <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
   <form action="{{ url_for('posts.delete_actual_post', post_id = post.id) }}" method="post">
     <input class="btn btn-danger" type="submit" value="Delete">
   </form>
</div>

1 Ответ

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

Вот мой код для удаления определенной строки по идентификатору.Вы можете связать его с вашим кодом

SQL-алхимия Модальный:

class Componants(db.Model):
    __tablename__ = 'componants'
    id = db.Column(db.Integer, primary_key=True)
    cmp_options = db.Column(db.Text, default=None)
    updated_at = db.Column(db.DateTime, nullable=True)
    created_at = db.Column(db.DateTime, nullable=True)


def __init__(self , cmp_options ):
    self.cmp_options = cmp_options 
    self.created_at = datetime.now()
    self.updated_at = datetime.now()

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

Контроллер:

@componants_blueprint.route('/delete_component/<component_id>')
@login_required
def delete_component(component_id):
    component = Componants.query.filter_by(id=component_id).first_or_404()
    db.session.delete(component)
    db.session.commit() 
    return True

Вид:

              <tbody>
                {% for item in all_components %}
                <tr>
                  <td>{{ item.id }}</td>
                  <td>{{ item.cmp_options }}</td>
                  <td>{{ item.created_at }}</td>
                  <td class="text-center"> 
                    <a href="{{ url_for('componants.delete_component', component_id=item.id) }}" title="Delete" class="far fa-trash-alt"></a>
                  </td>    
                </tr>
                {% endfor %}
            </tbody>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...