【发布时间】:2014-01-25 02:40:09
【问题描述】:
我有 2 个模型“Member”和“Event”。 它们处于“多对多”关系中。
现在我想创建一个视图,显示每个成员何时参加活动,何时不在,在这样的 html 表格中:
Name Event1 Event2 Event3 ...
Member1 x x ...
Member2 x x x ...
Member3 x x
Member4 x x ...
.
.
.
等等。
现在的问题是事件的数量在不断增加。 我唯一的想法是在视图中创建一个 html 表,但这不是很理想。
是否有可能手动创建查询集,其中首先包含一个成员,然后是所有事件,然后再次出现下一个成员,然后是所有事件?等等.. 或者有没有一种由 Django 管理的真正简单的方法来访问模板中的 manytomany 字段
这里是我的模型供进一步参考:
class Member(models.Model):
KAPELLMEISTER='KM'
FLOETE='FL'
KLARINETTE='KL'
SAXOPHON='SX'
FLUEGELHORN='FH'
TENORHORN='TH'
HORN='HR'
TROMPETE='TR'
POSAUNE='PS'
TUBA='TU'
SCHLAGZEUG='SZ'
INSTRUMENTS=(
(KAPELLMEISTER,'Kapellmeister'),
(FLOETE,'Floete'),
(KLARINETTE,'Klarinette'),
(SAXOPHON,'Saxophon'),
(FLUEGELHORN,'Fluegelhorn'),
(TENORHORN,'Tenorhorn'),
(HORN,'Horn'),
(TROMPETE,'Trompete'),
(POSAUNE,'Posaune'),
(TUBA,'Tuba'),
(SCHLAGZEUG,'Schlagzeug')
)
name = models.CharField('Name',max_length=200)
instrument = models.CharField('Instrument',
max_length=2,
choices=INSTRUMENTS,
null=False)
bool_musikschueler = models.BooleanField('Musikschueler')
bool_student = models.BooleanField('Student')
def __unicode__(self):
return self.name
@classmethod
def create(cls, name, instrument, musikschueler, student):
member = cls(name=name, instrument=instrument, bool_musikschueler=musikschueler, bool_student = student)
return member
class Event(models.Model):
PROBE='PR'
BEGRAEBNIS='BG'
MARSCHMUSIK='MM'
KONZERT='KO'
WECKRUF='WR'
TYPES=(
(PROBE,'Probe'),
(BEGRAEBNIS,'Begraebnis'),
(MARSCHMUSIK,'Marschmusik'),
(KONZERT,'Konzert'),
(WECKRUF,'Weckruf')
)
date = models.DateField('Datum')
type = models.CharField(max_length=2,
choices=TYPES,
default=PROBE)
description = models.TextField(max_length=200, blank=True)
anwesend = models.ManyToManyField(Member)#TODO: Widget fuer Django Admin aendern
def __unicode__(self):
return str(self.date.strftime("%Y-%m-%d"))+" , "+self.type
@classmethod
def create(cls, date, type, description):
event = cls(date=date, type=type, description=description)
return event
还有我的 html 模板:
<table>
<tr><th>Name</th>
{% for event in all_events %}
<th>{{event}}</th>
{% endfor %}
</tr>
{% for member in all_members %}
<tr>
<td>{{ member.name }}</td>
<td>{{ event.anwesend }}</td>
</tr>
{% endfor %}
</table>
和我的实验观点:
def statistiken(request):
all_members = Member.objects.all()
all_events = Event.objects.all()
for member in all_members:
anwesend=member.name+": "
for event in member.event_set.all():
anwesend+=str(event)
print(anwesend)
context = {'all_members': all_members,
'all_events' : all_events}
return render(request, 'anwesenheitsapp/statistiken.html', context)
【问题讨论】:
标签: django django-models django-templates django-views django-queryset