在 django 模板中编写循环时遇到问题

Posted

技术标签:

【中文标题】在 django 模板中编写循环时遇到问题【英文标题】:Having trouble writing loops in django template 【发布时间】:2018-09-11 23:44:56 【问题描述】:

大家好,我目前正在处理 django 视图和模板,但遇到了一些问题。 我有一个名为“代谢物”的模型,其中包含:id、名称、隔间、电荷和公式 5 组件。 我有另一个名为“Reactionsmeta”的模型,其中包含:id(reactions)、name、metabolie1、metabolite2、....metabolite6。这个模型的表格没有填写完整,因为有时一个id对应5个代谢物,但有时甚至20个。

我写了一个可以显示所有反应的模板,当我点击反应进入详情页面时,我也想显示这个反应涉及的代谢物。我的views.py和模板如下:

reactions_detail.html

% extends 'Recon/Base.html' %
% load static %
% block title %Reaction Details% endblock %
% block body %
<h1> reactionsmeta.id </h1>
<h2> reactionsmeta.name</h2>
<!-- Left Album Info -->
<div class="col-sm-4 col-md-3">
    <div class="panel panel-default">
        <div class="panel-body">
            <a href="% url 'detail_reaction' reactionsmeta.id %">
                % if reactionsmeta.id %
                    <img src="% static "Recon/images/Logo-Technische-Universiteit-Eindhoven.jpg" %" class="img-responsive">
                % else %
                    <h3>No image to display</h3>
                % endif %
            </a>
            <h1> reactionsmeta.id  <small> reactionsmeta.name </small></h1>
        </div>
    </div>
</div>

views.py
from django.views import generic
from .models import Reactionsmeta,Metabolites,Reactions
from django.shortcuts import render


class IndexView(generic.ListView):
template_name = 'Recon/index.html'
context_object_name = 'Reactions_object'

def get_queryset(self):
    return Reactionsmeta.objects.all()


class DetailsView(generic.DetailView):
model = Reactionsmeta
template_name = 'Recon/reactions_detail.html'

def get_context_data(self, **kwargs):
    context = super(DetailsView, self).get_context_data(**kwargs)
    context['metabolite'] = Metabolites.objects.all()
    context['reactions'] = Reactions.objects.all()

    # And so on for more models
    return context

如何在reaction_detail.html中编写循环???

编辑

class Metabolites(models.Model):
id = models.CharField(primary_key=True, max_length=255)
name = models.CharField(max_length=255, blank=True, null=True)
compartment = models.CharField(max_length=255, blank=True, null=True)
charge = models.CharField(max_length=255, blank=True, null=True)
formula = models.CharField(max_length=255, blank=True, null=True)
notes = models.CharField(max_length=255, blank=True, null=True)

class Meta:
    managed = False
    db_table = 'Metabolites'

class Reactionsmeta(models.Model):
id = models.CharField(primary_key=True, max_length=255)
name = models.CharField(max_length=255, blank=True, null=True)
metabolite1 = models.ForeignKey('Metabolites', db_column='metabolite1', 
blank=True, null=True, on_delete=models.CASCADE)
stoichiometry1 = models.IntegerField(blank=True, null=True)
metabolite2 = models.CharField(max_length=255, blank=True, null=True)
stoichiometry2 = models.IntegerField(blank=True, null=True)
metabolite3 = models.CharField(max_length=255, blank=True, null=True)
stoichiometry3 = models.CharField(max_length=255, blank=True, null=True)
......
stoichiometry55 = models.CharField(max_length=255, blank=True, null=True)
metabolite56 = models.CharField(max_length=255, blank=True, null=True)
stoichiometry56 = models.CharField(max_length=255, blank=True, null=True)
metabolite57 = models.CharField(max_length=255, blank=True, null=True)
stoichiometry57 = models.CharField(max_length=255, blank=True, null=True)
metabolite58 = models.CharField(max_length=255, blank=True, null=True)
stoichiometry58 = models.CharField(max_length=255, blank=True, null=True)
metabolite59 = models.CharField(max_length=255, blank=True, null=True)
stoichiometry59 = models.CharField(max_length=255, blank=True, null=True)
metabolite60 = models.CharField(max_length=255, blank=True, null=True)
stoichiometry60 = models.CharField(max_length=255, blank=True, null=True)

class Meta:
    managed = False
    db_table = 'ReactionsMeta'

【问题讨论】:

我们可以看看您的反应模型、反应元模型和代谢物模型吗?我们可以访问代谢物、反应元和反应之间的关系,但我们需要查看这些字段的名称以及它们是否设置了相关名称。 您好,感谢您的关心。我编辑了这个问题并将反应元模型和代谢物模型放在上面。 乐于助人。您的 metabolite1 字段是外键而其余的是 CharFields 的任何特殊原因?假设 metabolite2-60 实际上是外键是否合理? 是的,都是外键 原因是在后台可以点击代谢物,查看Reactionmeta信息的同时查看该代谢物的信息 【参考方案1】:

我没有看到一个很好的方法来做到这一点,因为每个代谢物都有自己的字段,不一定是外键。如果代谢物位于ManyToMany 字段中,through 定义化学计量,那会更容易。

Django's ManyToMany Relationship with Additional Fields

https://docs.djangoproject.com/en/2.0/topics/db/examples/many_to_many/

也就是说,在模板中,您可以通过以下方式显示 Reactionsmeta metabolite1 和化学计量:

% if reactionsmeta.metabolite1 %
    Metabolite: % reactionsmeta.metabolite1 %
    Stoichiometry: % reactionsmeta.stoichiometry1 %
% endif %
% if reactionsmeta.metabolite2 %
    Metabolite: % reactionsmeta.metabolite2 %
    Stoichiometry: % reactionsmeta.stoichiometry2 %
% endif %
...
% if reactionsmeta.metabolite60 %
    Metabolite: % reactionsmeta.metabolite60 %
    Stoichiometry: % reactionsmeta.stoichiometry60 %
% endif %

以上问题:

    非常重复 如果字段实际上是外键,则其原始值对用户没有任何意义。

编辑:回应评论说 CharFields 实际上是 FK。

所以我认为您需要在 db 中查询有关视图中代谢物的信息并将其返回给模板。我认为,按照设计,模板不应该能够访问数据库。

编辑:恐怕您将不得不学习如何编写自定义视图。这确实不错,但是仅使用泛型就很难做一些你正在尝试的事情。

https://docs.djangoproject.com/en/2.0/topics/http/views/

【讨论】:

感谢您的耐心等待!但是,如果我访问 Metabolite 模型中的数据,是否有可能?如果我为这样的东西写一个循环是否有可能: % ifreactions.metabolite1 != '' % metabolite.metabolite1.id 我的意思是,如何在一个模板中访问多个模型的数据?正如您在我的views.py中看到的那样,DetailsView类的模型只是Reactionsmeta,我怎样才能将Metabolites也包含到这个类中? 你绝对可以这样做 HAOYANG 但是metabolite 来自哪里以及metabolite.metabolite1reactions.metabolite1 有什么关系,在 python 中,一个空字符串将评估为 False。 您好,ReactionMeta 是一个包含代谢物 1 - 代谢物 60 的模型。这些列中的数据是ids(例如10FDHTMl),而Metabolites Model中的信息,包含id、name、compartment和formula,这里的ids与metabolite1-60中的数据完全相同。于是关系就派生了

以上是关于在 django 模板中编写循环时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

循环模板的键值 - Django 查询

django在模板中迭代dict时遇到问题[重复]

在 Django 模板中迭代 dict 时遇到问题

我在将 Css 文件链接到 Django 模板时遇到问题

for循环中的Django模板多维数组访问

关于编写几个 django 模板的建议