2017-11-16 10 views
2

방금 ​​django를 확인한 결과 에 인수로 id을 전달하여 책을 나열 할보기를 시도했습니다. 하지만 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' 

books/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

편집 - 여기

├── 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가'return redirect ('list_view', kwargs = {id : instance.id})'. – Alasdair

답변

3

에 당신은 잘못 장고 2.0에서 새 path을 사용하고 있습니다. \d+과 같은 정규식을 사용하면 안됩니다. 변경하려면 다음으로 변경하십시오.

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

name은 URL을 바꾸려면 필요합니다.

정규 표현식을 고수하려면 re_path (또는 url())을 사용하십시오. 이전 버전의 장고와 호환되도록하려면 계속 사용하십시오. 자세한 내용은 URL dispatcher docs을 참조하십시오.

슬래시도 유의하십시오. 그렇지 않으면 경로가 http://192.168.0.106:8000/books/list/21이지만 http://192.168.0.106:8000/books/list/21/이 아닙니다.

+0

고마워요.'/'와'/'를 사용하지 않았습니다. - 행운이 없습니다. – Laxmikant

+0

매력적이었습니다. – Laxmikant