Таблица Django создана с неправильными столбцами - PullRequest
1 голос
/ 11 июля 2019

Я пытаюсь получить столбцы, необходимые для таблицы, из модели.Работает нормально.Но когда я изменяю данные модели, откуда берутся столбцы, сервер должен быть перезапущен, чтобы он вступил в силу.

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

Новый код: 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})

Но теперь появляется ошибка: объект 'InventoryTable' не имеет атрибута 'fields'

Ответы [ 2 ]

2 голосов
/ 11 июля 2019

Я не думаю, что использованный вами подход будет работать.

У вас есть процедурный код внутри class Meta: вместо стандартного определения атрибутов класса.Классы Python считываются в память только один раз, при этом при запуске сервера, а не каждый раз, когда обрабатывается запрос.Таким образом, код, который находится внутри class Meta:, запускается только при запуске сервера.

Для этого вам нужно найти другой подход.Вы искали в документах динамическое определение столбцов?

Этот аналогичный вопрос , кажется, использует аргумент extra_columns в конструкторе таблицы.

1 голос
/ 12 июля 2019

Наконец-то смог добиться того, чего хотел.Я вернулся к своему первоначальному подходу и вместо того, чтобы добавить новый столбец, я исключил те, которые мне не нужны.Это было очень просто.https://stackoverflow.com/a/20033827/1998915

...