Flask передает переменные через маршруты

#python #flask #flask-sqlalchemy

#python #flask #flask-sqlalchemy

Вопрос:

Итак, у меня проблема, когда я использую маршрут flask для редактирования существующей вкладки в моем проекте. Что должно произойти, так это то, что в моем проекте хранятся две вещи user и tabs. У меня есть несколько вкладок, которые находятся в моей базе данных, и я хочу создать для нее функциональность редактирования. Итак, я создаю и редактирую маршрут, который будет передавать идентификатор пользователя и идентификатор вкладки, который редактируется. Что должно произойти, так это то, что количество вкладок и описание, которые редактируются, появятся в поле ввода для редактирования. затем он должен изменить эту вкладку в базе данных и вернуться на страницу, на которой показаны все таблицы с редактированием.

Что происходит, так это то, что независимо от того, на какую вкладку я нажимаю, в поле ввода отображается информация о первых вкладках, и когда я отправляю редактирование, добавляю и фиксирую изменения в базе данных, добавляется новая вкладка и присваиваются ей измененные значения. Я вставлю 3 фрагмента кода.

** у меня есть вся правильная информация о sqlalchemy, импортированная

первая часть кода — это база данных

 class Users(Base):
    __tablename__ = 'users'

    id = Column(Integer, primary_key = True)
    username = Column(String(16), nullable = False, unique = True, index = True)

class Tab_Event(Base):
    __tablename__ = 'tab_event'

    id = Column(Integer, primary_key = True)
    description = Column(String(200))
    amount = Column(String(10))#may be changed to a float or decimal value later on during development
    user_id = Column(Integer(10), ForeignKey('users.id'))
    users = relationship(Users)
  

Следующий раздел кода — это используемые маршруты

 @app.route('/user/<int:user_id>')
def DisplayUsers(user_id):
    user = session.query(Users).filter_by(id = user_id).one()
    items = session.query(Tab_Event).filter_by(user_id = user.id)
    return render_template('viewTabs.html', user = user, items = items)

@app.route('/newtab/<int:user_id>', methods = ['GET', 'POST'])
def AddNewTab(user_id):
    if request.method == 'POST':
        newTab = Tab_Event(amount = request.form['amount'], description = request.form['description'], user_id = user_id)
        session.add(newTab)
        session.commit()
        return redirect(url_for('DisplayUsers', user_id = user_id))
    return render_template('createTab.html', user_id = user_id)

@app.route('/edit/<int:user_id>/<int:tab_id>', methods = ['GET', 'POST'])
def EditTabEvent(user_id, tab_id):
    editTab = session.query(Tab_Event).filter_by(id = user_id).one()
    if request.method == 'POST':
        if request.form['name']:
            editTab.name = request.form['amount']
        if request.form['description']:
            editTab.description = request.form['description']
        session.add(editTab)
        session.commit()
        return redirect(url_for('DisplayUsers', user_id = user_id))
    else:
        return render_template('editTab.html', user_id = user_id, tab_id = tab_id, item = editTab)
  

Последний фрагмент кода — это HTML-документ, который я использую для редактирования

 <html>
  <body>

    <h1>This page is where new users are made</h1>
    <form action="{{url_for('AddNewTab', user_id = user_id, tab_id = item.id)}}" method="POST">
      <table>
        <tr>
          <td>Username</td>
          <td><input type="text" name="name"></td>
        </tr>
        <tr>
          <td>Amount</td>
          <td><input type="text" name="amount", value="{{item.amount}}"></td>
        </tr>
        <tr>
          <td>Description</td>
          <td><input type="text" name="description", value="{{item.description}}"></td>
        </tr>
        <tr>
          <td><input type="Radio">Personal</td>
          <td><input type="Radio">Business</td>
        </tr>
        <tr>
          <td><input type="submit" value="Edit Tab"></td>
        </tr>
      </table>
    </form>

  </body>
</html>
  

репозиторий, содержащий эти файлы, находится ниже:
vagrant >> Оплата>> все файлы для этого проекта для запуска на локальном компьютере
https://github.com/omar-jandali/Udacity-Tournament/tree/master/vagrant/PayUp

Комментарии:

1. смотрите SQL-запрос в EditTabEvent — вы не используете tab_id для получения данных, поэтому вы всегда получаете первую вкладку.

2. и посмотрите, что ваша модель Tab_Event id это не идентификатор пользователя (он user_id тоже есть), но в запросе, который вы используете id=user_id , так и должно быть id=tab_id

3. спасибо, что сразу исправили проблему. у меня было ощущение, что это связано с одной из переменных, которые я установил.

4. Таким образом, он выдает правильную информацию, но когда я отправляю форму, она не вносит изменений в базу данных, и значения не меняются. можете ли вы помочь мне с этим. Я думаю, что это находится в edit route def, когда я устанавливаю новые значения и фиксирую, и я попробовал несколько вещей, но безуспешно.. @furas

5. вы используете session.add(editTab) so, вероятно, новые значения добавляются как новая строка в базе данных (конечно, с новым уникальным идентификатором). Удалите это, если вы хотите обновить исходную строку.