使用 classes 列表作为 django_tables2 中 table class 的模型
Using a list of classes as a model for table class in django_tables2
我尝试使用与我在 django 中的数据库无关的 class 创建一个 table,这个 class 存储在 models.py
中,如下所示( InfoServer
就是 class)。我想做的是使用这个 class 来填充我的 table 使用 django_tables2
。添加 models.Model
作为参数不是一个选项,因为我不想将此 class 保存在数据库中。
每当我在 tables.py
中定义 model = InfoServer
时,我都会收到此错误,我想这是因为 InfoServer
没有将 models.Model
作为参数。
TypeError: descriptor 'repr' of 'object' object needs an argument
感谢任何帮助。
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'
如我所见,InfoServer
class 不是 Django 模型。我也不认为你需要直接使用它。因此,您可以简单地提供一个带有字典的列表,然后使用 table.
在模板中呈现它
首先,我们需要更新 Table class 并从中删除 Meta class,因为我们不会使用任何 django 模型。
class TableServeur(tables.Table):
<b>pid = tables.Column()
memory = tables.Column()
cpu = tables.Column()</b>
现在,从 InfoServer
class:
中向 return 字典添加一个新的对象方法
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})
有关如何使用数据填充 table 的更多信息,请参见 documentation
。
我尝试使用与我在 django 中的数据库无关的 class 创建一个 table,这个 class 存储在 models.py
中,如下所示( InfoServer
就是 class)。我想做的是使用这个 class 来填充我的 table 使用 django_tables2
。添加 models.Model
作为参数不是一个选项,因为我不想将此 class 保存在数据库中。
每当我在 tables.py
中定义 model = InfoServer
时,我都会收到此错误,我想这是因为 InfoServer
没有将 models.Model
作为参数。
TypeError: descriptor 'repr' of 'object' object needs an argument
感谢任何帮助。
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'
如我所见,InfoServer
class 不是 Django 模型。我也不认为你需要直接使用它。因此,您可以简单地提供一个带有字典的列表,然后使用 table.
首先,我们需要更新 Table class 并从中删除 Meta class,因为我们不会使用任何 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})
有关如何使用数据填充 table 的更多信息,请参见 documentation
。