我正在建立一个地址簿,其中包括条目之间的关系等.我有个人,公司,场地和角色的单独模型.在我的索引页面上,我想列出每个模型的所有实例,然后过滤它们.这样一个人就可以轻松搜索并找到一个条目.我已经能够使用通用视图列出单个模型,并使用get_extra_context来显示另一个模型:
#views.py
class IndividualListView(ListView):
context_object_name = "individual_list"
queryset = Individual.objects.all()
template_name='contacts/individuals/individual_list.html'
class IndividualDetailView(DetailView):
context_object_name = 'individual_detail'
queryset = Individual.objects.all()
template_name='contacts/individuals/individual_details.html'
def get_context_data(self, **kwargs):
context = super(IndividualDetailView, self).get_context_data(**kwargs)
context['role'] = Role.objects.all()
return context
Run Code Online (Sandbox Code Playgroud)
我还可以使用自定义视图列出单个模型:
#views.py
def object_list(request, model):
obj_list = model.objects.all()
template_name = 'contacts/index.html'
return render_to_response(template_name, {'object_list': obj_list})
Run Code Online (Sandbox Code Playgroud)
以下是这两个测试的urls.py:
(r'^$', views.object_list, {'model' : models.Individual}),
(r'^individuals/$',
IndividualListView.as_view(),
),
(r'^individuals/(?P<pk>\d+)/$',
IndividualDetailView.as_view(),
),
Run Code Online (Sandbox Code Playgroud)
所以我的问题是"如何修改它以将多个模型传递给模板?" 它甚至可能吗?StackOverflow上的所有类似问题只询问两个模型(可以使用get_extra_context解决).
我有一个具有多个通用关系的模型,在我的模板中使用它变得非常复杂.该模型是一个'演出'或音乐活动,发生在'Venue'和/或'Festival',并有一个'Musician'和/或'Ensemble'.
复杂的地方是每个'Gig'都有一个演示者,推广者和代理人.这些设置为与其他模型(如"PresenterCompany")的通用关系.演示者公司可以是推广者,演示者或代理人,或者是同一个演出者的所有人.以下是模型(简化为参考):
class Gig(models.Model):
description = models.CharField(max_length=100, blank=True)
date = models.DateTimeField()
venue = models.ForeignKey(Venue)
festival = models.ForeignKey(Festival, blank = True, null=True)
musician = models.ManyToManyField(Musician, blank=True)
ensembles = models.ManyToManyField(Ensemble, blank = True)
presenter_content_type = models.ForeignKey(ContentType,
limit_choices_to={"model__in": ("Individual", "ArtsOrganization",'Presenter', "BookingAgent","Festival", "OtherOrganization","PresenterCompany", "Venue")}, related_name = "Presenter Type", verbose_name = "Presenter",blank=True, null=True)
presenter_id = models.IntegerField(db_index=True, blank=True, null=True, verbose_name='Presenter ID')
presenter = generic.GenericForeignKey('presenter_content_type','presenter_id')
promoter_content_type = models.ForeignKey(ContentType,
limit_choices_to={"model__in": ("Individual", "ArtsOrganization","BookingAgent","Presenter", "Festival", "OtherOrganization","PresenterCompany", "Venue")}, related_name = "promotor", verbose_name='Promoter Type', blank=True, null=True)
promoter_id = models.IntegerField(db_index=True, blank=True, null=True, verbose_name='Promoter …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用list_display访问管理员中的字段.根据文档:(https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_display),不支持ManyToManyFields.我通过创建这样的自定义方法来解决这个问题:
#models.py
class Gig
musician = models.ManyToManyField(Musician)
note = models.CharField(max_length=20)
def __unicode__(self):
return u'%s' % (self.note)
def gig_musicians(self):
return self.musician.all()
#admin.py
class GigAdmin
list_display = ('note', 'gig_musicians')
Run Code Online (Sandbox Code Playgroud)
这给了我正在寻找的结果,但它非常难看(这也适用于通用关系).结果如下:
[<Musician: Richard Bona>, <Musician: Bobby Mcerrin>]
Run Code Online (Sandbox Code Playgroud)
我认为这是因为我如何构建方法.你对如何使这更优雅,即只是名字有任何建议吗?
我尝试了其他解决方案,例如, django显示了很多地方的内容,但我无法让它为我工作(它只显示无)