#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, вероятно, новые значения добавляются как новая строка в базе данных (конечно, с новым уникальным идентификатором). Удалите это, если вы хотите обновить исходную строку.