Я создаю приложение, похожее на адресную книгу. Для одного из моих взглядов у меня есть список людей. У каждого Individual есть Role, который связывает их с их должностью и работодателем. Есть несколько разных типов работодателей, так что это общее отношение.

Используя общее представление ListView, я создал список лиц, в котором отображаются их имена, должности и работодатели, т. Е.

«Джимми, офицер, Chase Bank»

«Мэри, генеральный директор больницы общего профиля»

Мне нужно, чтобы названия компаний были ссылками на страницу с подробными сведениями о компаниях.

Проблема

Поскольку у меня есть один шаблон для этого списка, мне трудно понять, как изменить URL-адрес в зависимости от того, какой тип работодателя у человека, то есть банк или больница.

Что может сработать

  1. Должен ли я написать функцию для представления, которая принимает тип контента работодателя и создает переменную? Или я должен поместить функцию в модель Role? Я новичок в python/Django и даже не знаю, как это написать.

  2. Я попытался использовать в шаблоне операторы 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')

В какой-то момент все работодатели унаследовали от модели компании. Я изменил его, потому что у каждого работодателя есть разные атрибуты, что сильно усложняло работу.

Благодарность!

0
Nahanaeli Schelling 25 Окт 2012 в 02:39
Не могли бы вы добавить, как вы определили структуру наследования ваших работодателей?
 – 
dokkaebi
25 Окт 2012 в 05:02
Привет, @dokkaebi, я добавил свои модельные структуры в ответ на ваш комментарий. Это дало мне идею! Что, если бы я создал модель компании, с которой каждый разный тип компании имел отношения OneToOne? Тогда URL-адрес может быть таким же, и страница сведений будет просто отображать другую информацию на основе операторов if ...
 – 
Nahanaeli Schelling
25 Окт 2012 в 20:03

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, чтобы получить человека и т. Д.

0
vicvicvic 25 Окт 2012 в 20:07