2017-11-16 10 views
2

ちょうどdjangoをチェックしていて、idを引数としてURL books/urls.pyに渡して書籍のリストを表示しようとしていました。しかし404ページが見つかりませんでした。私は、ブラウザでこのURLを入力したとき、私は、URLでいただきました間違っ届かない:Djangoでpath()を使用して404が見つかりません

http://192.168.0.106:8000/books/list/21/ 

書店/ urls.py

urlpatterns = [ 
    path('admin/', admin.site.urls), 
    path('books/', include("books.urls")) 
] 

settings.py

INSTALLED_APPS = [ 
    'django.contrib.admin', 
    'django.contrib.auth', 
    'django.contrib.contenttypes', 
    'django.contrib.sessions', 
    'django.contrib.messages', 
    'django.contrib.staticfiles', 
    'books' 
    ] 
... 
... 
... 
ROOT_URLCONF = 'bookstore.urls' 

書籍/ urls.py

urlpatterns = [ 
    path('home/', create), 
    path('list/(?P<id>\d+)', list_view), 
] 

冊/ views.py

def create(request): 
    form = CreateForm(request.POST or None, request.FILES or None) 
    if form.is_valid(): 
     instance = form.save(commit=False) 
     instance.save() 
     messages.success(request, "Book Created") 
     return redirect('/books/list', kwargs={"id":instance.id}) 
    return render(request, "home.html", {"form":form}) 


def list_view(request, id=None): 
    books = Book.objects.filter(id=id) 
    return render(request, "list.html", {"books": books}) 

プロジェクト構造: - 404 Page

EDIT - ここ

├── books 
│   ├── admin.py 
│   ├── forms.py 
│   ├── __init__.py 
│   ├── models.py 
│   ├── urls.py 
│   └── views.py 
├── bookstore 
│   ├── __init__.py 
│   ├── settings.py 
│   ├── urls.py 

はスクリーンショットであるコメントで取り上げたよう - 試してみました付加することにより/books.urlsのURL表現が、運:( Screenshot

+0

'books = Book.objects.filter(id = id)'を使うのはやや奇妙です。 'id'が本のidならば、' book = Book.objects.get(id = id) '、あるいは' book = get_object_or_404(Book、id = id) 'を見ると期待します。 – Alasdair

+0

@Alasdair - 実際には 'book_id'だったので重複していたので、テストの一環として' id'に置き換えました。 – Laxmikant

+2

また、あなたの 'redirect'行は、間違ってハードコードされたURLとkwargsを混ぜています。あなたは 'return redirect( '/ books/list /%s /'%instance.id)'でURLを構築するか、DjangoにURLを '' return redirect( 'list_view'、kwargs = {id:instance.id}) '。 – Alasdair

答えて

3

にあなたは間違ってDjangoの2.0から新しいpathを使用しています。 \d+のような正規表現は使用しないでください。それを変更してみてください:あなたはURLを逆にしたい場合は

path('list/<int:id>/', list_view, name='list_view'), 

nameが必要です。

正規表現を使用したい場合は、re_path(またはurl())を使用してください。古いバージョンのDjangoと互換性を持たせたい場合は、そのまま使用してください。詳細は、URL dispatcher docsを参照してください。

スラッシュも同様です。そうでなければ、パスはhttp://192.168.0.106:8000/books/list/21に一致しますが、http://192.168.0.106:8000/books/list/21/には一致しません。

+0

ありがとう、 '/'と '/' - no luckなしで試してみました – Laxmikant

+0

チャームのように働いて、ありがとう。 – Laxmikant

関連する問題