我正在构建一个类似于地址簿的应用。对于我的一个观点,我有一份个人名单。每个Individual
都有Role
,将其与职称和雇主联系起来。有几种不同类型的雇主,所以这是一种通用的关系。
使用ListView通用视图,我创建了一个显示其姓名,职位和雇主的个人列表,即
“吉米,大通银行官员”
“玛丽,总医院首席执行官”
我需要将这些公司的名称作为链接转到公司详细信息页面。
问题
由于我有一个此列表的模板,我很难理解如何根据个人的雇主类型(银行或医院)更改网址。
可能起作用
我应该为获取雇主内容类型并创建变量的视图编写函数吗?或者我应该将该功能置于Role
模型下?我是python / Django的菜鸟,我不知道怎么写这个。
我试图在模板中使用if / else语句,即如果是bank,请使用此URL,但它不起作用。可能是因为它是一般关系而我的查询不对。
回应以下评论:
我不确定继承结构的确切含义,但这里是我的模型的简化版本;
class Individual(models.Model)
name = models.CharField(max_length=30)
class Bank(models.Model):
name = models.CharField(max_length=30)
staff = generic.GenericRelation('Role',
content_type_field='employer_content_type',
object_id_field='employer_id'
)
class Hospital(models.Model):
name = models.CharField(max_length=30)
staff = generic.GenericRelation('Role',
content_type_field='employer_content_type',
object_id_field='employer_id'
)
... and so on for each different employer
class Role(models.Model):
title = models.CharField(max_length=70)
job_holder = models.ForeignKey(Individual)
employer_content_type = models.ForeignKey(ContentType,
limit_choices_to={"model__in": ('venue', 'festival', 'artsorganization','bookingagent', 'managementcompany', 'mediaoutlet', 'otherorganization', 'presentercompany', 'publishingcompany', 'presenter', 'recordcompany', 'musician', 'ensemble')}, related_name="employer")
employer_id = models.PositiveIntegerField()
employer = generic.GenericForeignKey('employer_content_type', 'employer_id')
有一次,我让所有雇主继承公司模式。我改变了它,因为每个雇主都有不同的属性,这使得事情变得非常复杂。
谢谢!
答案 0 :(得分:0)
我认为每种雇主都应负责为自己提供一个URL(见get_absolute_url)。也就是说,每个员工模型都会提供get_absolute_url
来确定自己的网址。
然后,您可以简单地使用(在您的模板中):
{{ individual.name }}
<a href="{{ individual.role.employer.get_absolute_url }}">
{{ individual.role.employer.name }}
</a>
这里简化了,因为“个人角色”关系是一对多关系,但是使用您在此实例中用于确定雇主姓名的任何机制。如果您的列表属于角色,那么您显然只需使用role.employer
而不是role.job_holder
来获取个人等。