如何递归地从父实例获得绝对url



我有一个页面模型,它包含自己作为可能的父页面的实例。所以每个页面都可以是另一个页面的子页面。我想做的是得到绝对的url给我的链接是根据它的父架构结构。假设有一个页面AAA,它有一个子页面BBB,它有一个子页面CCC。最后一个子节点的url是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'),

测试它,告诉我,我得到的路径给出了路径的正确父部分。但是解析url似乎不起作用,我认为它与反向和/或正则表达式有关。使用任何页面链接,即使是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)

所以首先你的page视图不接受path参数。

需要将def page(request, slug):修改为def page(request, slug, path):。此外,你需要重新考虑是否需要在url和视图中使用该参数,因为你不使用它。

后续部分可能不相关

还有一件事,你忘了把/放在url 的参数之间
url(r'^(?P<path>.+)(?P<slug>[w-]+)/$', views.page, name='details'),

应为

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

最新更新