0

I have a data table with three fields. All of these three (3) fields are foreign key of others table. But I want to display the actual data. How can I work it out? For now, I can only display their ID.

Database Table

class IS_MAC_IN_DB(object):
    def __init__(self, db, tablename, fieldname, error_message='Invalid MAC Address'):
        self.db = db
        self.tablename = tablename
        self.fieldname = fieldname
        self.error_message = error_message

    def __call__(self, value):
        row = self.db(self.db[self.tablename][self.fieldname] == value).select().first()
        if row:
            return (row.id, None)
        else:
            return (value, self.error_message)

    def formatter(self, value):
        return value

db.define_table('device_infra',
                Field('site_id', 'reference infra_site', label=T('Site'), ondelete='No ACTION'),
                Field('device_type_id','reference device_type', label=T('Device Type'), ondelete='NO ACTION'),
                Field('device_mac_id', 'reference device', label=T('Device Mac'), ondelete='NO ACTION')
                )

db.device_infra.device_mac_id.represent = lambda value, row: db(db.device.id == value).select(db.device.mac).first().mac if value else None

db.device_infra.device_mac_id.requires = [
        IS_NOT_EMPTY(error_message=T('Please select Device.')),
        IS_MAC_IN_DB(db, 'device', 'mac', error_message=T('Mac Address not found'))
]

db.device_infra.site_id.requires = IS_IN_DB(db, 'infra_site.id', '%(site)s', error_message='Site not found')

Controller

def index():
    # record = db.device_infra(request.args(0)) or redirect(URL('index'))
    device_infra_form = SQLFORM(db.device_infra)
    # device_infra_form.device_mac_id = db.device[record.device_mac_id].mac if record.device_mac_id else None

    # device_infra_form = SQLFORM(db.installed_devices)
    if device_infra_form.process().accepted:
        response.flash_type = "success"
        response.flash = 'Form accepted'
        # redirect(URL('index'))
    return dict(device_infra_form = device_infra_form)

View

{{extend 'layout_adminlte.html'}}

{{block head}}
<!-- DataTables -->
<link rel="stylesheet" href="{{=URL('static', 'adminlte/plugins/datatables/dataTables.bootstrap.css')}}">
{{end}}


<div class="box">
    <div class="box-header">
        <h1>Device Infra</h1>
        {{=device_infra_form}}
    </div>

    <div class="box-body">
    <table id="device_infra" class="table table-bordered table-hover dataTable"></table>
    </div>
</div>

{{block page_js}}
<!-- DataTables -->
<script src="{{=URL('static', 'adminlte/plugins/datatables/jquery.dataTables.min.js')}}"></script>
<script src="{{=URL('static', 'adminlte/plugins/datatables/dataTables.bootstrap.min.js')}}"></script>
<script>

$(function() {
    let columns = [
        {title: "Site", data: 'site_id', defaultContent: ''},
        {title: 'Device Type', data: 'device_type_id', defaultContent: ''},
        {title: 'Device MAC', data: 'device_mac_id', defaultContent: ''},
    ]

    console.log('{{=URL("api", "v1", args=["device_infra"])}}.json');
$("#device_infra").DataTable({
        // autoWidth: false,
        // deferRender: true,
        // serverSide: true,
        ajax: {
            url: '{{=URL("api", "v1", args=["device_infra"])}}.json',
            dataSrc: 'content',
            // data: function(d) {
            //     d['search']['regex'] = true;
            // }
        },
        columns: columns
    }).on('draw', function() {
    });

})


</script>
{{end}}
{{pass}}

I'm trying to display the actual data of the respective foreign key.

1
  • I hope you are aware that Python 2 went out of support several years ago. You should probably ignore Python 2, and spend your time on the currently recommended and supported version of the language, which is Python 3.
    – tripleee
    Commented Jul 6 at 9:03

0

Browse other questions tagged or ask your own question.