Я создаю приложение, похожее на адресную книгу. Для одного из моих взглядов у меня есть список людей. У каждого Individual
есть Role
, который связывает их с их должностью и работодателем. Есть несколько разных типов работодателей, так что это общее отношение.
Используя общее представление ListView, я создал список лиц, в котором отображаются их имена, должности и работодатели, т. Е.
«Джимми, офицер, Chase Bank»
«Мэри, генеральный директор больницы общего профиля»
Мне нужно, чтобы названия компаний были ссылками на страницу с подробными сведениями о компаниях.
Проблема
Поскольку у меня есть один шаблон для этого списка, мне трудно понять, как изменить URL-адрес в зависимости от того, какой тип работодателя у человека, то есть банк или больница.
Что может сработать
Должен ли я написать функцию для представления, которая принимает тип контента работодателя и создает переменную? Или я должен поместить функцию в модель
Role
? Я новичок в python/Django и даже не знаю, как это написать.Я попытался использовать в шаблоне операторы if / else, т.е. если банк, используйте этот 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')
В какой-то момент все работодатели унаследовали от модели компании. Я изменил его, потому что у каждого работодателя есть разные атрибуты, что сильно усложняло работу.
Благодарность!
1 ответ
Я считаю, что каждый работодатель должен нести ответственность за предоставление URL самому себе (см. get_absolute_url ). То есть каждая модель сотрудника предоставляет get_absolute_url
для определения URL-адреса для себя.
Затем вы можете просто использовать (в своем шаблоне):
{{ individual.name }}
<a href="{{ individual.role.employer.get_absolute_url }}">
{{ individual.role.employer.name }}
</a>
Здесь это упрощено, поскольку отношение «роль к человеку» - «один-ко-многим», но используйте любой механизм, который вы используете для определения имени работодателя в этом случае. Если в вашем списке ролей, вы, очевидно, просто используете role.employer
, а вместо role.job_holder
, чтобы получить человека и т. Д.
Похожие вопросы
Новые вопросы
django
Django - это серверная платформа веб-приложений с открытым исходным кодом, написанная на Python. Он разработан для сокращения усилий, необходимых для создания сложных веб-сайтов и веб-приложений, управляемых данными, с особым упором на меньшее количество кода, отсутствие избыточности и более явное, чем неявное.