如何从 parent 个实例递归地获取绝对值 url?

How to recursively get absolute url from parent instance(s)?

我有一个页面模型,它尽可能地包含自身实例 parent 页面。所以每一页都可以是另一页的child。我想做的是获得绝对 url 给我 link,它是根据其 parent 架构构建的。假设我有一个带 child BBB 的页面 AAA,它本身有一个 child CCC。最后 child 的 url 将是 mysite.com/AAA/BBB/CCC。我试过并想出了一个适合我的递归方法,但是我在解析 urls 时遇到了障碍。

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'),

对其进行测试,向我展示了我获得的路径给出了路径的正确 parental 部分。但是解析 urls 似乎不起作用,我认为它与反向 and/or 正则表达式有关。使用任何页面 link,即使应该是 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')