Django Python - 如何在一个 HTML 模板中显示来自不同表的信息
Posted
技术标签:
【中文标题】Django Python - 如何在一个 HTML 模板中显示来自不同表的信息【英文标题】:Django Python - How to display informations from different tables in one HTML template 【发布时间】:2017-09-01 11:37:47 【问题描述】:我有一个包含 4 个表的 mysql 数据库。 这些表在我的 models.py 文件(在我的 Django 应用程序中)中有 4 个相应的类。 我在 views.py 文件中定义了一些视图并制作了一些 html 模板,但每个模板只能与 1 个视图通信(我认为它必须是这样的)。 但我想在 html 模板上显示来自不同表(来自 models.py 的类)的信息。
例如: 我有一个这样的模板“about.html”:
% load static %
<link rel="stylesheet" type="text/css" href="% static 'pdbapp/stat_style.css' %" />
<body class="news">
<header>
<div class="nav">
<ul>
<li class="home"><a href="/pdbapp/home/">Home</a></li>
<li class="info PDB"><a href="/pdbapp/pdbinfo/">Infos</a></li>
<li class="about"><a class="active" href="/pdbapp/about/">About</a></li>
</ul>
</div>
</header>
</body>
<h1>About Us</h1>
<h2>Project members</h2>
% if namelist %
<ul>
% for i in namelist %
<li><a href="/pdbapp/pdbinfo/ i "> i </a></li>
% endfor %
</ul>
% else %
<p>No informations available.</p>
% endif %
我想在我的 HTML 模板中显示 MySQL 表“PDB”和“struct_sec”中的条目数(见下文):
CREATE TABLE PDB(
id_PDB_chain CHAR(5) NOT NULL PRIMARY KEY,
id_PDB CHAR(4) NOT NULL,
chaine VARCHAR(10) NOT NULL,
header VARCHAR(255) NOT NULL,
sequence_Proteine TEXT NOT NULL,
start_seq INT NOT NULL,
taille_Proteine INT NOT NULL,
resolution_PDB FLOAT NOT NULL,
meth_Res VARCHAR(10) NOT NULL,
FOREIGN KEY (meth_Res)
REFERENCES methodes_res(meth_Res)
ON DELETE CASCADE
);
CREATE TABLE struct_sec(
id_struct_sec INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
start_pred INT NOT NULL,
structure_Predite TEXT NOT NULL,
nombre_PPII INT NOT NULL,
pourcentage_PPII FLOAT NOT NULL,
angle_phi TEXT NOT NULL,
angle_psi TEXT NOT NULL,
id_PDB_chain CHAR(5) NOT NULL,
nom_Analyse VARCHAR(7) NOT NULL,
FOREIGN KEY (id_PDB_chain)
REFERENCES PDB(id_PDB_chain)
ON DELETE CASCADE,
FOREIGN KEY (nom_Analyse)
REFERENCES methodes_analyse(nom_Analyse)
ON DELETE CASCADE
);
下面是文件“models.py”中对应的类:
from __future__ import unicode_literals
from django.db import models
class Pdb(models.Model):
id_pdb_chain = models.CharField(db_column='id_PDB_chain', primary_key=True, max_length=5) # Field name made lowercase.
id_pdb = models.CharField(db_column='id_PDB', max_length=4) # Field name made lowercase.
chaine = models.CharField(max_length=10)
header = models.CharField(max_length=255)
sequence_proteine = models.TextField(db_column='sequence_Proteine') # Field name made lowercase.
start_seq = models.IntegerField()
taille_proteine = models.IntegerField(db_column='taille_Proteine') # Field name made lowercase.
resolution_pdb = models.FloatField(db_column='resolution_PDB') # Field name made lowercase.
meth_res = models.ForeignKey('MethodesRes', models.DO_NOTHING, db_column='meth_Res') # Field name made lowercase.
def __unicode__(self):
return self.id_pdb
class Meta:
managed = False
db_table = 'PDB'
class StructSec(models.Model):
id_struct_sec = models.AutoField(primary_key=True)
start_pred = models.IntegerField()
structure_predite = models.TextField(db_column='structure_Predite') # Field name made lowercase.
nombre_ppii = models.IntegerField(db_column='nombre_PPII') # Field name made lowercase.
pourcentage_ppii = models.FloatField(db_column='pourcentage_PPII') # Field name made lowercase.
angle_phi = models.TextField()
angle_psi = models.TextField()
id_pdb_chain = models.ForeignKey(Pdb, models.DO_NOTHING, db_column='id_PDB_chain') # Field name made lowercase.
nom_analyse = models.ForeignKey(MethodesAnalyse, models.DO_NOTHING, db_column='nom_Analyse') # Field name made lowercase.
def __str__(self):
return str(self.id_pdb_chain)
class Meta:
managed = False
db_table = 'struct_sec'
我该怎么做。 我是 Django 的初学者,请相信我真的试图理解网上已经解释过的内容,但没有成功。
【问题讨论】:
您可以在单个视图中查询所有表,然后将数据传递给模板。 【参考方案1】:您的视图应如下所示:
def detail(request, poll_id):
pdbs = Pdb.objects.all()
structSecs = StructSec.objects.all()
return render(request, 'detail.html', 'pdbs': pdbs, 'structSecs': structSecs)
然后在模板中:
% for pdb in pdbs %
pdb.header
% endfor %
% for structSec in structSecs %
structSecs.structure_predite
% endfor %
更多:queries 和 views 和 templates
【讨论】:
我认为如果我写这个,我的 html 页面将显示一个 Pdb 条目列表,然后是一个 StructSec 条目列表,但它并没有像我想要的那样计算条目。有没有类似的东西: pdbs = Pdb.objects.all().count() 哪个可以计算表 Pdb 中的条目?无论如何,感谢您在同一模板上显示所有信息的提示,我将尝试这样做。 这将起作用 pdbs = Pdb.objects.count() 或 pdbs = Pdb.objects.filter(header='something').count()。您可以标记为已接受吗? 而且它不起作用。我将 structSecs.structure_predite 更正为 structSec.structure_predite (删除“s”)但仍然存在此错误:“about() 恰好需要 2 个参数(1 个给定)”我认为 django 没有不明白 poll_id 是什么。如何解决这个问题?以上是关于Django Python - 如何在一个 HTML 模板中显示来自不同表的信息的主要内容,如果未能解决你的问题,请参考以下文章