6

如何在 django 中嵌套 url 调用?例如,如果我有两个模型定义为

class Post(models.Model):
    title = models.CharField(max_length=50)
    body = models.TextField()
    created = models.DateTimeField(auto_now_add=True, editable=False)


    def __unicode__(self):
        return self.title

    @property
    def comments(self):
        return self.comment_set.all()

class Comment(models.Model):
    comment = models.TextField()
    post = models.ForeignKey(Post)
    created = models.DateTimeField(auto_now_add=True)

使用以下 url 文件

根网址

urlpatterns = patterns('',
    url(r'^post/', include('post.urls')),
)

发布网址

urlpatterns = patterns('',
    url(r'^$', views.PostList.as_view()),
    url(r'^(?P<pk>[0-9]+)/$', views.PostDetail.as_view()),
    url(r'^(?P<pk>[0-9]+)/comments/$', include('comment.urls')),
)

评论网址

urlpatterns = patterns('',
    url(r'^$', CommentList.as_view()),
    url(r'^(?P<pk>[0-9]+)/$', CommentDetail.as_view()),
)

但是当我转到 /post/2/comments/1 时,我得到一个 Page not found 错误说明

Using the URLconf defined in advanced_rest.urls, Django tried these URL patterns, in this order:
^post/ ^$
^post/ ^(?P<pk>[0-9]+)/$
^post/ ^(?P<pk>[0-9]+)/comments/$
The current URL, post/2/comments/1, didn't match any of these.

虽然当我访问 /post/2/comments 时这不是问题 django 不允许这样嵌套 URL 调用吗?

4

3 回答 3

13

我认为可能是因为您正在使用美元符号完成正则表达式$。试试这条不带美元符号的行:

...
url(r'^(?P<pk>[0-9]+)/comments/', include('comment.urls')),
...

希望能帮助到你!

于 2013-05-14T18:57:51.487 回答
6

你有一个$在末尾r'^(?P<pk>[0-9]+)/comments/$'

这意味着 Django 只会在之后没有任何内容时与该 URL 匹配。

因此,目前不会考虑任何更长的 URL。因此,您需要将正则表达式更新为:

url(r'^(?P<pk>[0-9]+)/comments/', include('comment.urls')),
于 2013-05-14T18:56:58.250 回答
0

在 Django 2.0 以上,您可以简单地使用...

urlpatterns = [
    path('<pk>/comments/', include('comment.urls')),
]
于 2019-01-14T05:22:04.803 回答