可能な親ページとしてそれ自体のインスタンスを含むページモデルがあります。したがって、すべてのページは別のページの子になることができます。私がやりたいことは、親アーキテクチャに従って構造化されたリンクを提供するための絶対 URL を取得することです。では、子 BBB を持つページ AAA があり、それ自体に子 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'
私は何を間違っていますか?
編集:
ビュー.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)