Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django以一种通用的方式向上或向下传播人际关系_Django_Generics_Views_Relationships_Django Generic Views - Fatal编程技术网

Django以一种通用的方式向上或向下传播人际关系

Django以一种通用的方式向上或向下传播人际关系,django,generics,views,relationships,django-generic-views,Django,Generics,Views,Relationships,Django Generic Views,我正试图重写Django代码,使其在所有级别上尽可能通用。假设我有以下型号: class Tvshow(models.Model): pass class Season(models.Model): tvshow = models.ForeignKey(Tvshow) class Episode(models.Model): season = models.ForeignKey(Season) 电视剧有季,一季有集。为了简单起见,我省略了所有其他信息 这些对象的“我

我正试图重写Django代码,使其在所有级别上尽可能通用。假设我有以下型号:

class Tvshow(models.Model):
    pass

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

class Episode(models.Model):
    season = models.ForeignKey(Season)
电视剧有季,一季有集。为了简单起见,我省略了所有其他信息

这些对象的“我的详细视图”现在可以使用“详细视图”处理任何模型。但我也希望显示对象的关系,无论是父对象还是子对象。假设您正在观看电视节目。我无法调用tvshow.seasure\u set.all()来显示此信息,因为我的模板不知道它正在处理一个tvshow(也不知道tvshow有seasures)。相反,我希望能够做到这一点: object.children\u set.all()

这样,我就可以为这3个模型中的任何一个提供我的视图,而且它会起作用。这可能吗

p、 我知道这个物体。部分工作,但孩子们也会工作吗?我想出了一个难看的方法:使用relationship_name属性命名所有关系的子对象。我想这会奏效,但这不是我想走的方向

views.py:

from django.views.generic.detail import DetailView

class ObjectDetailView(DetailView):  
    template_name = "detail.html"
url.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'),
)
从tvshows.views导入ObjectDetailView
从tvshows.models导入Tvshow
urlpatterns=patterns('tvshows.views',
url(r'^(?P\d+/$),ObjectDetailView.as_view(model=Tvshow),name='detail'),
)

不幸的是,没有办法做到这一点。但是,如果您的唯一目标是拥有一个适用于所有三个视图的视图,您可以执行以下操作:

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

谢谢你的帮助。这是可行的,糟糕的是,它总是像这样,因为那样我仍然需要在某处定义规则。这意味着它不是真正通用的。我想我将通过为每个模板创建一个不同的模板来解决这个问题,该模板将从一个通用的父级继承。