#python #web2py
#python #web2py
Вопрос:
Я передаю первичный ключ таблицы, кортеж которой я хочу обновить. Это представление, из которого я передаю product_id.
{{for row in rows:}}
<tr>
<td>{{=x}}{{x=x 1}}</td>
<td>{{=row.product_id}}</td>
<!-- EDIT -->
<td><form action="{{=URL('pro_edit')}}" method="post">
<input name="pid" value="{{=row.product_id}}" type="hidden">
<input type="submit" value="Edit">
</form></td>
<tr> {{pass}}
Теперь это контроллер, на котором я его извлекаю. Я попробовал 2 вещи
testform = SQLFORM(db.products,db(db.products.product_id==request.post_vars.pid).select(),
fields=['product_id','price','pro_type','tags','category','description']))
return dict(form=testform)
--------------OR-------------
dform = SQLFORM(db.products,record=db(db.products.product_id==request.post_vars.pid).select(),
fields=['product_id','price','pro_type','tags','category','description'])
return dict(form=dform)
Но это не работает.
Его ошибка генерации
TypeError: list indices must be integers, not str
Ответ №1:
db(db.products.product_id==request.post_vars.pid).select()
Несмотря на то, что приведенное выше возвращает только одну запись, это Rows
объект, а не Row
object, поэтому вы должны явно извлечь первую строку, что вы можете сделать следующим образом:
db(db.products.product_id==request.post_vars.pid).select().first()
Другой вариант — использовать следующий ярлык:
db.products(product_id=request.post_vars.pid)
Комментарии:
1. 1) Указанный вами ярлык не работает. В нем говорится, что ‘product_id’ не является глобальным именем. Все работает нормально, если я даю полную ссылку’db.products.product_id’. 2) Даже после использования first() он не работает. Отображается ошибка — объект ‘Row’ не имеет атрибута ‘select’.
2. Я понял. На самом деле я передавал объект строки в поле записи . Вместо этого мне пришлось передать только запрос. Итак, при удалении select() это сработало.
3. привет, я получаю форму в представлении, но когда я отправляю ее, создается новая пустая форма (что нежелательно). Также обновления, которые я сделал в форме, не реплицируются в БД, но вместо этого новая запись формы вставляется в БД. Я только что вставил это перед возвратом locals() если dform.process().accepted: сессия. перенаправление flash = ‘Успешно обновлено'(URL(‘pro_list’))
4. Я думаю, вы неправильно поняли приведенный выше ярлык.
db.products(product_id=request.post_vars.pid)
это ярлык для полногоdb(db.products.product_id==request.post_vars.pid).select().first()
. Похоже, вы пытались добавить.select().first()
к ярлыку, что неверно. Ярлык создаетRow
объект, а не запрос, поэтому вы действительно передаетеRow
объект в качестве аргумента «запись»SQLFORM
(объект запроса не будет работать).5. Если запись не обновляется при отправке, я подозреваю, что у вас проблема в другом месте вашего кода. Вы могли бы рассмотреть возможность публикации более полного кода в группе web2py Google для получения дополнительной помощи.