2

複数の「モジュール」(それぞれがdjangoアプリとして)を使用して、djangoで単純なCMSを作成しています。以下のモデルをセットアップしました。

class FooObject(models.Model):
    id = models.SlugField(primary_key=True)
    name = models.CharField(max_length=255)
    creator = models.ForeignKey(auth.models.User, editable=False, related_name="createdby")

class FooPage(FooObject):
    content = models.TextField(blank=True, null=True)

    @models.permalink
    def get_absolute_url(self):
        return ('page', (), {'page_id':self.id}

class FooSubitem(FooObject):
    parent = models.ForeignKey(FooPage, related_name='subitems')

各モジュールで、FooPage のサブクラスと FooSubitem の少なくとも 1 つのサブクラスを作成します。

# in FooBlog.models
class FooBlog(FooPage):
    owner = models.ForeignKey(auth.models.User, editable=False)

    @models.permalink
    def get_absolute_url(self):
        return ('blog', (), {'blog_id':self.id})

class FooPost(FooSubitem):
    post_time = models.DateTimeField(auto_now_add=True)

# in FooGallery.models
class FooGallery(FooPage):
    location = models.CharField(max_length=255)

    @models.permalink
    def get_absolute_url(self):
        return ('gallery', (), {'gallery_id':self.id})

class FooImage(FooSubitem):
    image_file = models.ImageField(upload_to='foogallery')

これらは単純化したものですが、私がやろうとしていることをよく理解していただけるはずです。FooPost と FooImage の管理者では、親選択リストを対応する親ページに制限します。

これらをテンプレートで使用しようとすると、問題が発生します。各ビューには、次のものがあります。

page_list = FooPage.objects.all()

これは、FooBlog と FooGallery の両方のタイプのすべての FooPages のリストを返します。ただし、このリストを反復処理すると、次のようになります。

{% for page in page_list %}{{ page.get_absolute_url }}{% endfor %}

「ブログ」や「ギャラリー」の URL パターンではなく、「ページ」の URL パターンを返します。

後で FooCalendar モジュールを追加したいときに、コードを書き直さなくてもこれを機能させるにはどうすればよいですか? これが可能なモジュールで動作することを確認したいと思います。

ありがとう、

  • レクソ
4

3 に答える 3

2

この問題に対する従来の解決策は、そのインスタンスのサブクラスのタイプを格納する ContentType をスーパークラスに追加することです。このようにして、適切なタイプの関連するサブクラス オブジェクトを返す一貫した API を利用できます。

于 2010-07-06T05:52:07.967 に答える
1

django-model-utilsの InheritanceManager を使用すると、コンテンツ タイプ フィールドの追加を回避できます。

次に、クエリセットを呼び出す.select_subclassesと、すべてのオブジェクトがダウンキャストされます。次に例を示します。

FooPage.objects.select_subclasses().all()
于 2013-01-10T22:16:38.443 に答える
0

FooPage.objects.all()type のすべてのオブジェクトを返しますFooPage。これらのオブジェクトは、FooPage、FooBlog、FooGallery の基礎となるデータベース テーブル行の組み合わせになります。正しい URL を取得するには、FooBlog または FooGallery オブジェクトを取得する必要があります。

page.fooblog.get_absolute_url()

FooBlog.DoesNotExistページが単にページ オブジェクト、つまり FooPage を介して作成されたものである場合、エラーがスローされる可能性があるため、正しい URL を取得するには、次のようにすることができます。

   urls = []
   for page in FooPage.objects.all():
        try:
            page = page.fooblog
        except FooBlog.DoesNotExist:
            pass

            urls.append(page.get_absolute_url())

または、FooPage を実際のテーブルにしたくない場合は、FooPage を抽象クラスにしようとすることもできます。

于 2010-07-05T05:05:48.057 に答える