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

时间:2018-04-02 18:28:42

标签: python django for-loop django-templates django-views

大家好我正在研究django视图和模板,遇到了一些问题。 我有一个名为'代谢物的模型,其中包含:id,名称,隔室,电荷和配方5组分。 我有另一个名为' Reactionsmeta'的模型,其中包含:id(反应),名称,代谢物1,代谢物2,......代谢物6。这个模型的表格没有填写完整,因为有时一个id对应于5个代谢物,但有时甚至是20个。

我写了一个可以显示所有反应的模板,当我点击反应并进入详细页面时,我还想显示参与这个反应的代谢物。我的views.py和模板编写如下:

def compare_floats(row):
    return row['col1'] == row['col2'] # you can use any comparison you want here

df['col3'] = df.apply(compare_floats, axis=1)

index.html

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>

如何在reaction_detail.html ???

中编写循环

修改

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

1 个答案:

答案 0 :(得分:0)

我没有看到很好的方法,因为每个代谢物都有自己的领域,不一定是外键。如果代谢物位于ManyToMany区域,through定义化学计量,则会更容易。

Django's ManyToMany Relationship with Additional Fields

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

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

{% 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 %}

上述问题:

  1. 这是非常重复的
  2. 如果字段实际上是外键,则其原始值对用户来说并不意味着什么。
  3. 编辑:对CharFields实际上是FK的评论的回应。

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

    编辑:我担心你将不得不学习如何编写自定义视图。这真的不错,但很难做一些你尝试使用泛型的东西。

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