【问题标题】:Django Table created with wrong columns使用错误列创建的 Django 表
【发布时间】:2019-11-21 15:07:07
【问题描述】:

我正在尝试从模型中获取表所需的列。它工作正常。但是,当我更改从列获取的模型数据时,需要重新启动服务器才能使其生效。

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

新代码: 表.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”对象没有属性“字段”

【问题讨论】:

  • 我不明白问题出在哪里。能不能描述的更清楚一点?
  • 当然。所以我有来自模型“Inventory_basic”的表“InventoryTable”。所以该表包含许多变量,我不希望所有变量都一直显示。因此,他们取而代之的是从另一个模型中获取价值。这在第一次启动服务器时有效。当我更改“列模型”数据时,刷新网页不会使 django 重绘表格。只有重新启动才会重绘表格。

标签: python django django-tables2


【解决方案1】:

我认为你使用的方法行不通。

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

您需要为此找到不同的方法。您是否在文档中查看了列的动态定义?

这个similar question 似乎在表构造函数中使用了参数extra_columns

【讨论】:

  • 哦。这就说得通了。但是除了在 Meta 类中之外,我找不到任何其他方式来定义“字段”。有没有其他方法可以实现这一目标?谢谢
  • @AmarC 用相关问题的链接更新了我的答案。
  • 那个例子并不是我真正想要的,但我确实找到了另一种方法。请检查更新。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-18
    • 1970-01-01
    • 2013-12-15
    • 1970-01-01
    • 2019-06-27
    • 2013-04-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多