如何将数据传递给Django中的模板?

时间:2012-05-15 12:55:11

标签: django templates view parameters

在下面的模板中,我试图获取法院的名称(通过“建立”字段捕获)。我通过avail_times函数传递“club_id”,但是如何从此传递通过模板传递的“establishment”字段?

模特:

class Club(models.Model):
    establishment = models.CharField(max_length=200)
    address = models.CharField(max_length=200)
    def __unicode__(self):
        return self.establishment

class Available(models.Model):
    club = models.ForeignKey(Club)
    court = models.CharField(max_length=200)
    avail_time = models.DateTimeField('available time')
    def __unicode__(self):
        return self.court

功能:

def avail_times(request, club_id):
courts = Available.objects.filter(club__id=club_id)
return render_to_response('reserve/templates/avail_times.html', {'courts': courts})

模板:

    <h1>All available courts for {{ court.club }}</h1>
<ul>
{% for court in courts %}
    <li>{{ court }}</li>
{% endfor %}
</ul>

1 个答案:

答案 0 :(得分:17)

def avail_times(request, club_id):
  courts = Available.objects.filter(club__id=club_id)      
  if courts.count() > 0:
    club_name = courts[0].club.establishment
  else:
    # no results found for this club id!

# perhaps it is better to check explicity if the club exists before going further, 
# eg. Club.objects.get(pk=club_id)
# is club_id passed in as a string? I haven't used django in awhile somethign 
# worth looking into?

return render_to_response('reserve/templates/avail_times.html', {'courts': courts, 'club_name': club_name})


<h1>All available courts for {{ club_name }}</h1>
<ul>
  {% for court in courts %}
    <li>{{ court.club.establishment }}</li>
  {% endfor %}
</ul>

使用点表示法跨越外键关系。你必须“通过”外键才能进入Club模型。这是通过访问club属性来完成的。所以另外假设您想要访问企业名称和地址,您也可以添加<li>{{ court.club.address }}</li>来显示地址。

但要小心,您可以使用django调试工具栏查看正在执行的查询数。如果您有很多法庭,您可能会注意到性能受到影响。请记住一些事情。

Courts是一个查询集对象。您正在尝试访问不存在的court.club属性,因为您可能已经注意到django在发生这种情况时会无声地失败。获得俱乐部名称有几种方法。

您可能想对您的架构提出一些想法。俱乐部有多个球场?如果不是,那么使用.get就像Zahir建议的那样“更好”。如果它可以有多个法院,那么你应该调查一下ManyToMany关系以更好地反映这一点。