我正在尝试从模型中获取表所需的列。工作正常。但是,当我从获取列的位置更改Model数据时,需要重新启动服务器才能使其生效。
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')
更新:
从这个示例中,我能够找到使用元类的另一种方式:https://stackoverflow.com/a/703888/1998915
新代码: table.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})
但是现在出现错误:'InventoryTable'对象没有属性'fields'
答案 0 :(得分:2)
我认为您使用的方法无效。
您在class Meta:
内部有过程代码,而不是仅定义类属性的标准。在这种情况下,Python类仅在服务器启动时才一次读入内存,而不是每次处理请求时都读入内存。因此,class Meta:
中包含的代码仅在服务器启动时运行。
您需要为此找到其他方法。您是否在文档中寻找列的动态定义?
此similar question似乎在表构造函数中使用了自变量extra_columns
。
答案 1 :(得分:1)
终于能够实现我想要的。我回到了原来的方法,而不是添加新的专栏,我排除了我不需要的专栏。这很简单。 https://stackoverflow.com/a/20033827/1998915