代码之家  ›  专栏  ›  技术社区  ›  MilyMilo

如果路由以“post/”开头,Django与CreateView不匹配

  •  2
  • MilyMilo  · 技术社区  · 7 年前

    class CreatePostView(LoginRequiredMixin, generic.CreateView):
        model = Post
    
        login_url = '/login/'
        redirect_field_name = 'blog_app/post_detail.html'
    
        form_class = PostForm
    
        def form_valid(self, form):
            self.object = form.save(commit=False)
            self.object.author = self.request.user
            self.object.save()
            return super().form_valid(form)
    

    # Project urls
    url(r'^blog/', include('blog_app.urls'), name='blog'),
    
    # App urls
    url(r'^post/new/$', views.CreatePostView.as_view(), name='post_new'),
    

    Page not found (404)
        Request Method: GET
        Request URL:    http://127.0.0.1:8000/blog/post/new/
        Raised by:  blog_app.views.PostDetailView
    

    然而,这将起作用:

     url(r'^new/post/$', views.CreatePostView.as_view(), name='post_new'),
    

    http://127.0.0.1:8000/blog/new/post/ 
    

    我看到我的表格了。

    无论我在斜杠后写什么,如果第一部分是“post/”,它都会404我。至少我相信我观察到了这一点。

    url(r'^somesuperlongroute/add/$',
        views.CreatePostView.as_view(), name='post_new'),
    

    这是可行的,但应该是这样的。

    在路线的第一部分设置“post”有什么特别之处?我还有其他5条以“post/”开头的路线,实际上可能我只会在这里包括这个文件:

    from django.conf.urls import url, include
    from . import views
    
    app_name = 'blog_app'
    
    urlpatterns = [
        url(r'^$', views.PostListView.as_view(), name='post_list'),
        url(r'^about/$', views.AboutView.as_view(), name='about'),
        url(r'^post/(?P<slug>[-\w]+)/$',
            views.PostDetailView.as_view(), name='post_detail'),
        url(r'^post/(?P<slug>[-\w]+)/edit/$',
            views.PostUpdateView.as_view(), name='post_edit'),
        url(r'^post/new/$',
            views.CreatePostView.as_view(), name='post_new'),
        url(r'^drafts/$', views.DraftListView.as_view(), name='post_draft_list'),
        url(r'^post/(?P<slug>[-\w]+)/remove/$',
            views.PostDeleteView.as_view(), name='post_remove'),
        url(r'^post/(?P<slug>[-\w]+)/publish/$',
            views.post_publish, name='post_publish'),
        url(r'^post/(?P<slug>[-\w]+)/comment/$',
            views.add_comment_to_post, name='add_comment_to_post'),
        url(r'^comment/(?P<pk>\d+)/approve/$',
            views.comment_approve, name='comment_approve'),
        url(r'^comment/(?P<pk>\d+)/remove/$',
            views.comment_remove, name='comment_remove'),
    ]
    

    1 回复  |  直到 7 年前
        1
  •  2
  •   knbk    7 年前

    Django将使用第一个匹配的正则表达式,在本例中为 r'^post/(?P<slug>[-\w]+)/$' .这条路线到 PostDetailView new

    要解决这个问题,只需将 CreatePostView 高于

    urlpatterns = [
        ...
        url(r'^post/new/$',
            views.CreatePostView.as_view(), name='post_new'),
        url(r'^post/(?P<slug>[-\w]+)/$',
            views.PostDetailView.as_view(), name='post_detail'),
        ...
    ]