Методы, модифицирующие базу данных, делают нефункциональным метод удаления строки из базы данных

#python #html #flask

#python #HTML #flask

Вопрос:

Я создаю базу данных выборов для университета, используя flask и html для пользовательского интерфейса. У меня есть страница со списком моих кандидатов и их сторон с полем для изменения стороны и кнопкой, которая должна полностью удалить кандидата. Когда я нажимаю кнопку удаления, она изменяет участник на «None».

Дело в том, что когда я полностью удаляю функциональность для изменения участника — кнопки и метода одновременно — кнопка удаляет строку из базы данных, как и предполагалось.

Вот соответствующие методы:

 @app.route("/votes/<candidate_id>/", methods=["POST"])
@login_required
def candidate_set_party(candidate_id):

    p = Candidate.query.get(candidate_id)
    p.party = request.form.get("party")
    db.session().commit()

    return redirect(url_for("votes_index"))
  
 
@app.route("/votes/<candidateid>/", methods=["POST"])
@login_required
def candidate_remove(candidateid):
    #c = Candidate.query.get(candidate_id)


    print("debug")
    db.session().query(Candidate).filter(Candidate.id == candidateid).delete()
    #db.session().delete(c)
    #votes.delete().where(votes.Candidate.id==candidate_id)
    db.session().commit()

    #d = addresses_table.delete(Candidate.query.get(id))
    #d.execute()

    return redirect(url_for("votes_index"))
  

Вот html-страница:

 {% extends "layout.html" %}

{% block body %}
  <table>
    <tr>
      <th>Name</th>
      <th>Party</th>
    </tr>
    {% for candidate in votes %}
    <tr>
      <td>{{ candidate.name }}</td>
      <td>{{ candidate.party }}</td>
      <td>
          <form method="POST" action="{{ url_for('candidate_set_party', candidate_id=candidate.id) }}">
            <input type="text" name="party"/>
            <input type="submit" value="Set party"/>
          </form>
      </td>
      <td>
        <form method="POST" action="{{ url_for('candidate_remove', candidateid=candidate.id) }}">
          <input type="submit" value="Remove candidate"/>
        </form>
      </td>
      <td>
        <form method="POST" action="{{ url_for('cast_vote', candidate_id=candidate.id) }}">
          <input type="submit" value="Vote"/>
        </form>
      </td>
    </tr>
    {% endfor %}
  </table>
{% endblock %}
  

Вот репозиторий на случай, если я что-то пропустил:https://github.com/skajanti/Aanestys

Когда у меня есть функциональность для смены участника в моей программе, candidate_remove вообще не вызывается (отсюда print («debug»)). Вместо этого он каким-то образом изменяет участник на «None» (возможно, представление flask для ввода null?).

Помощь будет оценена.

Ответ №1:

Похоже, что обе ваши функции candidate_remove и candidate_set_party зарегистрированы в одних и тех же маршрутах и методах.

У них должны быть уникальные маршруты. Я приведу пример, на случай, если я не совсем ясно выражаюсь.

 @app.route("/set-party/<candidate_id>/", methods=["POST"])
@login_required
def candidate_set_party(candidate_id):
    p = Candidate.query.get(candidate_id)
    p.party = request.form.get("party")
    db.session().commit()
    return redirect(url_for("votes_index"))

@app.route("/remove-candidate/<candidateid>/", methods=["POST"])
@login_required
def candidate_remove(candidateid):
    db.session().query(Candidate).filter(Candidate.id == candidateid).delete()
    db.session().commit()
    return redirect(url_for("votes_index"))
  

HTML может оставаться неизменным.