2016-09-22 52 views
0

我有一个页面模型,其中包含自己的实例作为可能的父页面。所以每一页都可以成为另一页的子页面。我想要做的是获得绝对的URL给我链接,根据其父体系结构进行结构化。假设我有一个带有BBB的页面AAA,它本身有一个孩子CCC。最后一个孩子的网址是mysite.com/AAA/BBB/CCC。我玩过并想出了一个适用于我的递归方法,但是我解决了网址时遇到了一堵砖墙。如何从父实例递归获取绝对URL?

models.py

class Page { 
    ... 
    parent = models.ForeignKey('self', null=True, blank=True, unique=False) 
    .... 

    def get_parent_path(self, list=None): 

      parenturl = [] 

      if list is not None: 
       parenturl = list 

      if self.parent is not None: 
       parenturl.insert(0,self.parent.slug) 
       return self.parent.get_parent_path(parenturl) 

      return parenturl 

    def get_absolute_url(self): 

      path = '' 

      if self.parent is not None: 
       parentlisting = self.get_parent_path() 
       for parent in parentlisting: 
        path = path + parent + '/' 

      path = path + self.slug; 

      return reverse("pages:details", kwargs={"path": path, "slug": self.slug}) 

urls.py

 url(r'^(?P<path>.+)(?P<slug>[\w-]+)/$', views.page, name='details'), 

测试它,向我展示了这条道路,我得到给出了路径的正确的家长组成部分。但解决网址似乎并没有工作,我认为这与逆向和/或正则表达式有关。使用任何页面链接,即使在404应该是,现在会给我输入错误。

TypeError at /###/###/ 

page() got an unexpected keyword argument 'path' 

我在做什么错了?

编辑:

views.py

def page(request, slug): 

    instance = get_object_or_404(Page, slug=slug) 

    context = { 
     "title": instance.title, 
     "page": instance, 
    } 

    return render(request, "page.html", context) 
+1

请发表您的' views.page'视图。 –

+0

是的,这似乎与您的get_absolute_url方法或您发布的任何代码没有任何关系。 –

+0

@vishes_shell发布了更新 – Ablivion

回答

1

所以首先你所有page鉴于不接受path说法。您需要将def page(request, slug):更改为def page(request, slug, path):。你也需要重新思考,如果你需要在你的url和你的视图中的参数,因为你不使用它。

另外一部分可能没有相关

还有一件事,你忘了在网址参数之间/

url(r'^(?P<path>.+)(?P<slug>[\w-]+)/$', views.page, name='details'), 

应该

url(r'^(?P<path>.+)/(?P<slug>[\w-]+)/$', views.page, name='details') 
+0

的意见对不起,这不是问题所在。 '路径'已经添加/在每个父母之后。 – Ablivion

+0

@Ablivion更新了答案 –

+0

添加视图的路径为我工作。然而,由于某种原因,它将显示顶级父母(mysite.com/AAA)的404页面,而所有这些都是它工作的孩子。我不得不在urlpattern中创建额外的行,一个用于顶级父页面,一个用于子页面。 你是什么意思我需要重新思考,如果我需要路径参数?我使用它通过访问mysite.com/AAA/BBB/CCC而不是mysite.com/CCC来访问页面CCC。我是新来的Django,所以我可能会错过一些东西,有没有一种更有效的方式来获得绝对网址在这里? – Ablivion