2017-02-20 14 views
0

Моя сетка отображает продукты с LEFT OUTER JOIN, чтобы показать дополнительную информацию, если продукт уже выбран.Web2py SQLFORM.grid Выбор поля, но не отображаемого в сетке

Все работает отлично.

Теперь я хочу добавить описание продукта в атрибут title названия продукта. Итак, когда пользователь нажимает (мыши над?) На имя, отображается описание.

db.product.productname.represent = lambda value, row: A(value, _href=URL('offer', 'view_product', args=row.product.id), _title=row.product.description) 

Это работает, когда описание db.product.description включено в поля в сетке. Но тогда также отображается столбец, чего я не хочу. Когда я устанавливаю .readable = False. Столбец не отображается, но описание также не отображается.

Я также попытался использовать заголовки, чтобы указать только поля, которые я хочу отобразить, но он по-прежнему показывает столбец описания.

Как я могу включить поле в запрос, но не показывать его в сетке?

Вот вся сетка:

pagecontent = SQLFORM.grid(query, 
        left=db.product_offer_item.on((db.product.id == db.product_offer_item.product_id)\ 
                & (db.product_offer_item.offer_id == currentquote)), 
        args=[groupid], 
        create=False, 
        editable=False, 
        deletable=False, 
        details=False, 
        csv=False, 
        orderby=db.product.productname, 
        fields=[db.product.productname, 
          db.product.purchasecost, 
          db.product.monthlycost, 
          db.product_offer_item.optional, 
          db.product_offer_item.quantity, 
          db.product_offer_item.discount, 
          db.product.description # Here is the problem field 
          ], 
        # headers={'product.productname' : db.product.productname.label, 
        #    'product.purchasecost' : db.product.purchasecost.label, 
        #    'product.monthlycost' : db.product.monthlycost.label, 
        #    'product_offer_item.optional' : db.product_offer_item.optional.label, 
        #    'product_offer_item.quantity' : db.product_offer_item.quantity.label, 
        #    'product_offer_item.discount' : db.product_offer_item.discount.label}, 
        maxtextlength = 100, 
        links=[lambda row: A(T('Update'), 
                _href='#', 
                _class='button btn btn-default', 
                _id=row.product.id, 
                _name='btnUpdate') 
          ] 

        ) 

Кнопка обновления не имеет никакой связи, поскольку она обрабатывается JS, чтобы обойти эту проблему, чтобы не быть в состоянии сделать каждую строку его собственной формы.

ответ

0

Я решил это, включив в него поле, которое я не хочу отображать в качестве первого поля в списке (так это первый столбец), а затем установите для скрытого div.

db.product.description.represent = DIV(' ', _style='display:None') 

и скрыть заголовок, в сетке установить заголовок для этого столбца на то же самое.

headers = {'product.productname':DIV(' ', _style='display:None) 

С полях для столбца он занимает очень мало места в начале таблицы. Даже не заметно. Было бы так же легко перемещать поле в другое место в порядке, если бы небольшое пространство было лучше.

Теперь представление для productname с описанием в атрибуте title работает.

db.product.productname.represent = lambda value, row: A(value, 
                 _href=URL('offer', 'view_product', args=row.product.id), 
                 _class='blacklinks', 
                 _title=row.product.description)