Django:如何将不同的URL传递给通用视图?

时间:2012-10-24 22:39:51

标签: django url variables

我正在构建一个类似于地址簿的应用。对于我的一个观点,我有一份个人名单。每个Individual都有Role,将其与职称和雇主联系起来。有几种不同类型的雇主,所以这是一种通用的关系。

使用ListView通用视图,我创建了一个显示其姓名,职位和雇主的个人列表,即

  

“吉米,大通银行官员”

     “玛丽,总医院首席执行官”

我需要将这些公司的名称作为链接转到公司详细信息页面。

问题

由于我有一个此列表的模板,我很难理解如何根据个人的雇主类型(银行或医院)更改网址。

可能起作用

  1. 我应该为获取雇主内容类型并创建变量的视图编写函数吗?或者我应该将该功能置于Role模型下?我是python / Django的菜鸟,我不知道怎么写这个。

  2. 我试图在模板中使用if / else语句,即如果是bank,请使用此URL,但它不起作用。可能是因为它是一般关系而我的查询不对。

  3. 回应以下评论:

    我不确定继承结构的确切含义,但这里是我的模型的简化版本;

    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')
    

    有一次,我让所有雇主继承公司模式。我改变了它,因为每个雇主都有不同的属性,这使得事情变得非常复杂。

    谢谢!

1 个答案:

答案 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来获取个人等。