2017-07-09 7 views
2

私はdjangoに小さなブログのウェブサイトを作成しました。私は一般的なビューとすべての作品を使用しています。私はルートが '投稿/'で始まる場合、DjangoはCreateViewと一致しません

# 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_app.urlsするblog.urls経由でルーティングするんだけど、私は/ブログ/ポスト/新/ I'LLに行くとき

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) 

:ジェネリックCREATEVIEWあるCreatePostView EXCEPT

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'), 
を10

今すぐに行く場合

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

私のフォームを参照してください。

最初の部分が '投稿/投稿'されている場合は、スラッシュの後に何を書いても問題ありません。少なくともそれは私が私が観察したと信じているものです。 それはあまりにも反対方向に動作します:

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

これは動作しますが、それは可能になっている方法です。

ルートの最初の部分に '投稿'を付けるのはどういう意味ですか?

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'), 
] 

任意のアイデア:私は実際に多分私はちょうどここにこのファイルを含めるよどの作品、「ポスト/」で始まる5つの他のルートがありますか?私はモデル、ビュー、フォームをあなたが望むものを提供することができますが、私はそれらが適切であるとは思わなかった。

答えて

2

Djangoは最初に一致する正規表現を使用します(この場合はr'^post/(?P<slug>[-\w]+)/$')。これはPostDetailViewにスラッグがnewのルートです。あなたがそのスラグとのポストを持っていないので、ビューは単にPostDetailViewCreatePostViewを入れ、これを修正するには404

が発生します:

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'), 
    ... 
] 
+0

をうん、それは理にかなっています。私はそれについて考えなかった、ありがとう:) – MilyMilo

関連する問題