Джанго: перекрестные ссылки

У меня следующая структура сайта:

- Windows
    - 98
         - Subpage1
         - Subpage2
    - XP
         - ....
    - 7
    - ....
- Mac
    - 10.7
         - Subpage1
         - Subpage2
    - 10.8
         - ...
    - 10.9
- Ubuntu
    - 13.10

Каждая ОС — это приложение, и мне нужна дополнительная модель для каждого приложения, которая представляет собой перекрестную ссылку. Ссылка может вести на любую страницу.

Таким образом, псевдокод будет выглядеть так:

class Reference(models.Model):
     title = models.CharField(_('title'), max_length=200)
     links_to = models.ForeignKey(Windows | Mac | Ubuntu)

Я нашел сообщения об общем отношении, но не смог использовать решения для своей проблемы.

Ссылка на хороший, простой для понимания учебник или любую помощь была бы отличной.

Спасибо

Изменить:

Я подумал, что это может сработать. Но в этом примере я могу получить доступ только к одному свойству (slug), а не ко всему объекту:

from django.db import models
from itertools import chain

from otherapp.models import Geschaeftsfelder
from otherapp.models import Themenschwerpunkte
from otherapp.models import Themen

from django.utils.translation import ugettext as _
from common.fields import MarkdownTextField, translated_field

class Box(models.Model):

    title = models.CharField(max_length=100)

    headline_de = MarkdownTextField(verbose_name=_(u'Inhaltstext (dt.)'), blank=True)


    geschaeftsfelder = Geschaeftsfelder.objects.values_list('slug', 'title')
    themenschwerpunkte = Themenschwerpunkte.objects.values_list('slug', 'title')
    themen = Themen.objects.values_list('slug', 'title')

    result_list = chain(geschaeftsfelder, themenschwerpunkte, themen)

    links_to      = models.CharField(
                        max_length=200,
                        choices= result_list
                        )

Изменить 2: я также попробовал решение с общими типами контента:

Когда я добавляю следующий код в свою модель Box, я получаю раскрывающийся список с правильными типами контента (themenschwerpunkte, geschaeftsfelder, ...).

Но я все еще не могу создать ссылку на конкретную страницу.

# http://stackoverflow.com/questions/6335986/how-can-i-restrict-djangos-genericforeignkey-to-a-list-of-models?lq=1
limit = models.Q(app_label = 'geschaeftsfelder', model = 'geschaeftsfelder') | models.Q(app_label = 'geschaeftsfelder', model = 'themenschwerpunkte') | models.Q(app_label = 'geschaeftsfelder', model = 'themen')
content_type = models.ForeignKey(ContentType, limit_choices_to = limit)
object_id = models.PositiveIntegerField()
content_object = generic.GenericForeignKey('content_type', 'object_id')

Редактировать 3:

Большое спасибо за ваши ответы и потраченное время, но я собираюсь использовать feinCMS вместо djangoCMS. Это гораздо легче понять для меня и более подходит.


person Alexander Scholz    schedule 31.10.2013    source источник
comment
Когда вы говорите, что каждая ОС — это отдельное приложение, вероятно, вы имеете в виду, что это отдельные модели в разных приложениях. Это кажется странной моделью данных: кажется, было бы лучше иметь одну модель для хранения разных значений для ОС.   -  person Daniel Roseman    schedule 31.10.2013
comment
Ну структура немного другая, чем в моем примере. Каждая ОС имеет свою структуру.   -  person Alexander Scholz    schedule 31.10.2013
comment
Может быть, я не понимаю вашего ответа. Можете ли вы объяснить это более подробно или привести пример?   -  person Alexander Scholz    schedule 05.11.2013


Ответы (1)


Подход типа контента кажется подходящим. документы django по обобщенным отношениям — очень хороший источник.

Я копирую некоторые фрагменты кода, которые я использовал, возможно, они будут полезны:

object_id    = models.PositiveIntegerField(blank=True, null=True)
content_type = models.ForeignKey(ContentType, blank=True, null=True, verbose_name="Verweist auf")
of           = generic.GenericForeignKey('content_type', 'object_id' )

В admin я использую типы контента, определяя специальные функции, например. один, чтобы получить все пустые отношения (в вашем случае: ОС не выбрана)

def get_queryset(self, request):
    qs = super(MyObjectAdmin, self).get_queryset(request)
    return qs.filter(content_type=None)
person OBu    schedule 05.11.2013
comment
Извините, я не совсем понимаю, что мне нужно делать. Где именно вы добавляете второй блок кода? - person Alexander Scholz; 05.11.2013
comment
Это в моем admin.py и в моем MyModelAdmin. Но подобный код будет работать и в других разделах, я просто хотел показать один пример, где content_typeиспользовался в каком-то коде. В моем проекте я использую три разные модели для организаций/лиц, и на них ссылается ContentType ForeignKey. - person OBu; 05.11.2013