0

可能な親ページとしてそれ自体のインスタンスを含むページモデルがあります。したがって、すべてのページは別のページの子になることができます。私がやりたいことは、親アーキテクチャに従って構造化されたリンクを提供するための絶対 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)
4

1 に答える 1

1

したがって、まず第一に、あなたの見解は議論pageを受け入れていません。path

def page(request, slug):に変更する必要がありますdef page(request, slug, path):。また、使用しないため、URL とビューでそのパラメーターが必要かどうかを再考する必要があります。

それ以降の部分は関連しない可能性があります

/そしてもう1つ、URLのパラメーターの間に入れるのを忘れていました

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

する必要があります

url(r'^(?P<path>.+)/(?P<slug>[\w-]+)/$', views.page, name='details')
于 2016-09-22T19:02:21.367 に答える