0

Django コードを書き直して、すべてのレベルで可能な限り汎用的にしようとしています。次のモデルがあるとします。

class Tvshow(models.Model):
    pass

class Season(models.Model):
    tvshow = models.ForeignKey(Tvshow)

class Episode(models.Model):
    season = models.ForeignKey(Season)

テレビ番組にはシーズンがあり、シーズンにはエピソードがあります。簡単にするために、他のすべての情報を省略しました。

これらのオブジェクトの詳細ビューは、DetailView を使用して任意のモデルを処理できるようになりました。しかし、親または子のオブジェクトの関係も表示したいと思います。あなたがテレビ番組を見ているとしましょう。tvshow.season_set.all() を呼び出してこの情報を表示することはできません。これは、テンプレートがテレビ番組を扱っていることを認識していない (テレビ番組に季節があることも認識していない) ためです。代わりに、object.children_set.all() を実行できるようにしたいと考えています。

そうすれば、これら 3 つのモデルのいずれかを自分のビューにフィードでき、機能します。これは可能ですか?

ps私はオブジェクトを知っています。一部は機能しますが、子供たちの一部も機能しますか? 私が思いついた厄介なハックが 1 つあります。relation_name プロパティを使用して、すべてのリレーションの子に名前を付けます。うまくいくと思いますが、それは私が取りたい方向ではありません。

ビュー.py:

from django.views.generic.detail import DetailView

class ObjectDetailView(DetailView):  
    template_name = "detail.html"

urls.py

from tvshows.views import ObjectDetailView
from tvshows.models import Tvshow

urlpatterns = patterns('tvshows.views',
    url(r'^(?P<pk>\d+)/$', ObjectDetailView.as_view(model = Tvshow), name='detail'),
)
4

1 に答える 1

0

残念ながら、いいえ、これを行う方法はありません。ただし、3 つすべてで機能する 1 つのビューを作成することが唯一の目標である場合は、次のようにすることができます。

class MyDetailView(DetailView):
    ...
    def get_context_data(self, **kwargs):
        context = super(MyDetailView, self).get_context_data(**kwargs)
        if hasattr(context['object'], 'season_set'):
            context['children'] = context['object'].season_set.all()
        elif hasattr(context['object'], 'episode_set'):
            context['children'] = context['object'].episode_set.all()

        return context
于 2012-07-25T15:03:24.593 に答える