Использование списка классов в качестве модели для табличного класса в django_tables2 - PullRequest
2 голосов
/ 24 мая 2019

Я попытался создать таблицу, используя класс, который не связан с моей базой данных в django, и этот класс хранится в models.py, как показано ниже (InfoServer - это класс).Я хотел использовать этот класс для заполнения таблицы, используя django_tables2.Добавить models.Model в качестве параметра нельзя, поскольку я не хочу сохранять этот класс в базе данных.

Всякий раз, когда я определяю model = InfoServer в tables.py, я получаю эту ошибку, и я полагаю, что этопотому что InfoServer не принял models.Model в качестве параметра.

TypeError: дескриптор ' repr ' объекта 'object' требует аргумент

Любая помощь приветствуется.

models.py

class TestServeur(models.Model):
    nom = models.CharField(max_length=200)
    pid = models.CharField(max_length=200)
    memoire = models.IntegerField(null=True)

class InfoServer:
    # "This is a class to test my knowledge of python"
    def __init__(self,p = '',c = 0,m = 0):
        self.pid = p
        self.cpu = c
        self.memoire = m

    def getData(self):
        return ("A server with %s memory and %s cpu" % (self.cpu,self.memoire))

views.py

def index(request):
    return HttpResponse("Hello, world. You're at the index.")

def cpu_view(request):
    liste = []
    proc1 = Popen(['ps','-eo','pid,%cpu,%mem,comm'], stdout=PIPE, stderr=PIPE)
    proc2 = Popen(['grep','java'], stdin=proc1.stdout, stdout=PIPE)
    proc1.stdout.close()

    for line in iter(proc2.stdout.readlines()):
        clean_line = line.decode("utf-8")
        info_utiles = clean_line.split()
        pid,cpu,mem,*rest = info_utiles
        i1 = InfoServer(pid,cpu,mem)
        liste.append(i1)

    table = TestServeur(liste)
    RequestConfig(request).configure(table)
    return render(request, 'server/cpu.html', {'output': table})

tables.py

class TableServeur(tables.Table):
    class Meta:
        # model = InfoServer
        fields = ['pid', 'memory', 'cpu']
        template_name = 'django_tables2/bootstrap4.html'

1 Ответ

3 голосов
/ 24 мая 2019

Как я вижу, InfoServer класс не является моделью Django.Кроме того, я не думаю, что вам нужно использовать это напрямую в любом случае.Итак, вы можете просто предоставить список со словарем и отобразить его в шаблоне с таблицей.

Во-первых, нам нужно обновить класс Table и удалить из него Meta-класс, так как мы не собираемся использовать какие-либо модели django..

class TableServeur(tables.Table):
    <b>pid = tables.Column()
    memory = tables.Column()
    cpu = tables.Column()</b>

Теперь добавляем новый метод объекта для возврата словаря из InfoServer class:

class InfoServer:
    # "This is a class to test my knowledge of python"
    def __init__(self,p = '',c = 0,m = 0):
        self.pid = p
        self.cpu = c
        self.memoire = m

    def getData(self):
        return ("A server with %s memory and %s cpu" % (self.cpu,self.memoire))

    <b>def get_dict_data(self):
        return {'pid': self.pid, 'cpu': self.cpu, 'memory': self.memoire}</b>

Наконец, обновите представление:

for line in iter(proc2.stdout.readlines()):
    clean_line = line.decode("utf-8")
    info_utiles = clean_line.split()
    pid,cpu,mem,*rest = info_utiles
    i1 = InfoServer(pid,cpu,mem)
    liste.append(<b>i1.get_dict_data()</b>)
table = TestServeur(liste)
return render(request, 'server/cpu.html', {'output': table})

Дополнительную информацию можно найти в documentation о том, как можно заполнять таблицу данными.

...