【发布时间】:2012-03-16 00:46:46
【问题描述】:
我是 Django 新手,到目前为止,我对它的功能印象深刻。我正在玩更复杂的模型,但我无法正确使用它们。使用 Django 1.3,我正在尝试编写一个摘要页面,该页面将显示以下具有以下结构的三个模型。换言之,包含目的地和活动的旅行列表。
- 行程 1
- 目的地 1
- 目的地 2
- 活动 1
- 旅行 2
- 目的地 1
- 活动 2
模型
- 旅行 TripDestination 目的地(一次旅行可以有多个目的地)
- 活动 -> 旅行、活动 -> 目的地(活动是为在特定位置/目的地的旅行定义的)
class Destination(models.Model):
city_name=models.CharField()
class Trip(models.Model):
departing_on=models.DateField()
returning_on=models.DateField()
destinations=models.ManyToManyField(Destination)
class Activity(models.Model):
destination=models.ForeignKey(Destination, null=False)
trip=models.ForeignKey(Trip, null=False)
我正在尝试编写一个视图,该视图将生成一个具有上述结构的页面。我现在遇到的主要问题是显示特定旅行和目的地的活动。正如您在下面的代码中看到的那样,我正在构建一个字典,我怀疑这是正确的做法。另外,视图变成了
查看
def list_trip(request, template_name = 'trip-list.html'):
trips = Trip.objects.all()
# Build a dictionary for activities -- Is this the right thing to do?
activities = Activity.objects.filter(trip__in=trips)
activities_by_trips = dict()
for activity in activities:
if activity.trip_id not in activities_by_trips:
activities_by_trips[activity.trip_id] = dict()
if activity.destination_id not in activities_by_trips[activity.trip_id]:
activities_by_trips[activity.trip_id][activity.destination_id] = []
activities_by_trips[activity.trip_id][activity.destination_id].append(activity)
return render_to_response(template_name, {
'page_title': 'List of trips',
'trips': trips,
'activities_by_trips': activities_by_trips,
})
模板
{% block content %}
{% for trip in trips %}
{{ trip.id }} - {{ trip.name }}
{% for destination in trip.destinations.all %}
{{ destination.city_name }}
** This is terrible code -- How to fix that **
{% for key, value in activities_by_trips|dict_lookup:trip.id %}
{% if value %}
{% for key_prime, value_prime in value|dict_lookup:destination.id %}
{{ value_prime.description }}
{% endfor %}
{% endif %}
{% endfor %}
{% endfor %}
{% endfor %}
{% endblock %}
简而言之,有人可以帮我总结一下所有的旅行和活动吗?实现这一目标的最佳方法是什么?模型是否正确?
谢谢!
【问题讨论】:
标签: python django django-models django-templates django-views