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 模板中显示来自不同表的信息的主要内容,如果未能解决你的问题,请参考以下文章

Django框架中的Context使用

Anaconda+django写出第一个web app

Django - - - -视图层之视图函数(views)

如何遍历 Django 模板中的字典?

如何在python文件中,引用django1.10的model

在pycharm里如何把一个普通的python项目改造成django项目?