I am trying to get the columns required for a table from a Model. It works fine. But when I change the Model data from where the columns are taken, server needs to be restarted for it to take effect.
tables.py:
class InventoryTable(tables.Table):
ip_addr = tables.Column(linkify=("detailed_view", (tables.A("ip_addr"), )))
class Meta:
a = Inventory_views.objects.get(view_name="default")
activeList = []
for field in a._meta.fields:
if field.name != "default" and (getattr(a, field.name) == True):
activeList.append(field.name)
activeTuple = tuple(activeList)
model = Inventory_basic
template_name = 'django_tables2/bootstrap.html'
fields = (activeTuple)
views.py:
def inventory_v2(request):
if 'search_query' in request.GET:
form = searchForm(request.GET)
if form.is_valid():
search_query = form.cleaned_data.get('search_query')
table = InventoryTable(Inventory_basic.objects.filter(ip_addr__icontains=search_query))
RequestConfig(request).configure(table)
return render(request, 'jd_inventory_v2.html', {'table': table, 'form': form})
else:
form = searchForm()
table = InventoryTable(Inventory_basic.objects.filter(ip_addr__icontains="NULL"))
RequestConfig(request).configure(table)
return render(request, 'inventory_v2.html', {'table': table, 'form': form})
models.py:
class Inventory_views(models.Model):
view_name = models.CharField(max_length=25,default="NA", verbose_name='View Name')
hw_serialno = models.BooleanField(default=True, verbose_name='Hardware SN')
location = models.BooleanField(default=True, verbose_name='Location')
ip_addr = models.BooleanField(default=True, verbose_name='IP Address')
UPDATE:
I was able to find another way to do this using metaclass from this example : https://stackoverflow.com/a/703888/1998915
New Code: tables.py:
class InventoryTable(tables.Table):
def __init__(self, *args, **kwargs):
exclude_list=kwargs.pop('exclude_list', '')
super(InventoryTable, self).__init__(*args, **kwargs)
for field in exclude_list:
del self.fields[field]
class Meta:
model = Inventory_basic
views.py:
def jd_inventory_v2(request):
if 'search_query' in request.GET:
form = searchForm(request.GET)
if form.is_valid():
search_query = form.cleaned_data.get('search_query')
table = InventoryTable(Inventory_basic.objects.filter(ip_addr__icontains=search_query),exclude_list=inactiveFields)
RequestConfig(request).configure(table)
return render(request, 'jd_inventory_v2.html', {'table': table, 'form': form})
else:
form = searchForm()
inactiveFields = viewFilter()
table = InventoryTable(data=Inventory_basic.objects.filter(ip_addr__icontains="NULL"), exclude_list=inactiveFields)
RequestConfig(request).configure(table)
return render(request, 'jd_inventory_v2.html', {'table': table, 'form': form})
But now getting the error : 'InventoryTable' object has no attribute 'fields'