使用错误列创建的Django表

时间:2019-07-11 20:36:31

标签: python django django-tables2

我正在尝试从模型中获取表所需的列。工作正常。但是,当我从获取列的位置更改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'

2 个答案:

答案 0 :(得分:2)

我认为您使用的方法无效。

您在class Meta:内部有过程代码,而不是仅定义类属性的标准。在这种情况下,Python类仅在服务器启动时才一次读入内存,而不是每次处理请求时都读入内存。因此,class Meta:中包含的代码仅在服务器启动时运行。

您需要为此找到其他方法。您是否在文档中寻找列的动态定义?

similar question似乎在表构造函数中使用了自变量extra_columns

答案 1 :(得分:1)

终于能够实现我想要的。我回到了原来的方法,而不是添加新的专栏,我排除了我不需要的专栏。这很简单。 https://stackoverflow.com/a/20033827/1998915

相关问题