如何从 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')
我有一个页面模型,它尽可能地包含自身实例 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')