【问题标题】:Django Python - How to display informations from different tables in one HTML templateDjango Python - 如何在一个 HTML 模板中显示来自不同表的信息
【发布时间】: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 的初学者,请相信我真的试图理解网上已经解释过的内容,但没有成功。

【问题讨论】:

  • 您可以在单个视图中查询所有表,然后将数据传递给模板。

标签: python html mysql django templates


【解决方案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 %}

更多:queriesviewstemplates

【讨论】:

  • 我认为如果我写这个,我的 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 是什么。如何解决这个问题?
猜你喜欢
  • 2017-09-07
  • 2015-02-15
  • 1970-01-01
  • 2020-08-03
  • 2017-04-19
  • 2018-10-21
  • 2022-12-09
  • 1970-01-01
  • 2020-07-12
相关资源
最近更新 更多