Создайте страницу обновления (используя SQLFORM) для обновления кортежа таблицы

#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 для получения дополнительной помощи.