Python Django不';如果路由以';邮政/';

Python Django不';如果路由以';邮政/';,python,regex,django,routing,views,Python,Regex,Django,Routing,Views,我用django写了一个小博客网站。我使用的是通用视图,所有的东西都能用。除了CreatePostView,它是一个通用的CreateView: class CreatePostView(LoginRequiredMixin, generic.CreateView): model = Post login_url = '/login/' redirect_field_name = 'blog_app/post_detail.html' form_class =

我用django写了一个小博客网站。我使用的是通用视图,所有的东西都能用。除了CreatePostView,它是一个通用的CreateView:

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)
我正在通过blog.url将其路由到blog\u app.url

# Project urls
url(r'^blog/', include('blog_app.urls'), name='blog'),

# App urls
url(r'^post/new/$', views.CreatePostView.as_view(), name='post_new'),
但是当我去/blog/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'),
]
从django.conf.url导入url,包括
从…起导入视图
应用程序名称='博客应用程序'
URL模式=[
url(r'^$',views.PostListView.as_view(),name='post_list'),
url(r“^about/$”,views.AboutView.as_view(),name='about'),
url(r'^post/(?P[-\w]+)/$”,
views.PostDetailView.as_view(),name='post_detail'),
url(r'^post/(?P[-\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[-\w]+)/remove/$”,
views.PostDeleteView.as_view(),name='post_remove'),
url(r'^post/(?P[-\w]+)/publish/$”,
views.post_publish,name='post_publish'),
url(r'^post/(?P[-\w]+)/comment/$”,
views.add_comment_to_post,name='add_comment_to_post'),
url(r'^comment/(?P\d+)/approve/$),
views.comment\u approve,name='comment\u approve'),
url(r'^comment/(?P\d+)/remove/$),
views.comment_remove,name='comment_remove'),
]

有什么想法吗?我可以提供您想要的模型、视图和表单,但我觉得它们不相关。

Django将使用第一个匹配的正则表达式,在本例中是
r'^post/(?p[-\w]+)/$”
。这将路由到
postdailview
,并插入
new
。因为你没有一篇文章是关于那个鼻涕虫的,所以这个视图会显示404

要解决此问题,只需将
CreatePostView
放在
PostDetailView
上方:

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'),
    ...
]
urlpatterns=[
...
url(r“^post/new/$”,
views.CreatePostView.as_view(),name='post_new'),
url(r'^post/(?P[-\w]+)/$”,
views.PostDetailView.as_view(),name='post_detail'),
...
]

是的,这很有道理。我没想过,谢谢:)