我有一个页面模型,它包含自己作为可能的父页面的实例。所以每个页面都可以是另一个页面的子页面。我想做的是得到绝对的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')