Django - 在模板中显示关系表的逻辑

时间:2013-05-16 13:00:39

标签: python django django-templates django-views

我的Django模型中定义了多个相关表:

# first models.py

from django.db import models

class Character(models.Model):
    first_field = models.DateTimeField()
    second_field = models.TextField()

# second models.py

from django.db import models

class Op(models.Model):
    fk_character = models.ForeignKey('Character')
    some_field = models.DateTimeField()
    other_field = models.TextField()


class Participant(models.Model):
    fk_op = models.ForeignKey('Op')
    fk_character = models.ForeignKey('Character')
    some_other_field = models.IntegerField(default=0)

现在,我将这样的数据从视图发送到模板:

# views.py

from django.shortcuts import render_to_response
from django.template import RequestContext

from second.models import MainModel

def home(request):
    data = Op.objects.filter(some_field__isnull=True).order_by('-date')
    rc = RequestContext(request, {'data':data})
    return render_to_response('index.html', rc)

通过这种方式,我确实拥有了Op模板中所需的所有index.html相关数据,但我正在努力使用逻辑以特定方式在我的模板中显示此数据。例如:

  • 显示所有Ops
  • 的列表
  • 针对每个列表项,检查当前Character项中Participant是否也是Op
  • 如果不是,则显示一些按钮,如果不显示按钮

我知道模板不应该处理任何编程逻辑,但我也不确定解决这个问题的最佳方法是什么。我应该在视图中执行所有逻辑并构造一个新对象并将该对象发送到我的视图,还是有一种简单的方法可以在模板中使用我正在发送的当前对象来解决这个问题?

1 个答案:

答案 0 :(得分:1)

更新您的型号:

class Op(models.Model):
    fk_character = models.ForeignKey('Character')
    some_field = models.DateTimeField()
    other_field = models.TextField()

    def check_if_participant(self):
        return bool(self.participant_set.all())

显示所有Ops的列表:

{% for op in data %}
   {{op.some_field}}

   {% if op.check_if_participant %}Yes - Character is participant {% endif %}
{% endfor %}