2016-07-15 8 views
11

Jestem nowy dla Django i Pythona. Podczas mapowania adresu URL do widoków otrzymuję następujący błąd: TypeError: widok musi być wywoływalny lub lista/krotka w przypadku include().TypeError: widok musi być wywoływalny lub lista/krotka w przypadku include()

Adresy URL. Kod py: - kod

from django.conf.urls import url 
from django.contrib import admin 


urlpatterns = [ 
    url(r'^admin/', admin.site.urls), 
    url(r'^posts/$', "posts.views.post_home"), #posts is module and post_home 
]            # is a function in view. 

views.py: -

from django.shortcuts import render 
from django.http import HttpResponse 
# Create your views here. 
#function based views 

def post_home(request): 
    response = "<h1>Success</h1>" 
    return HttpResponse(response) 

Traceback

enter image description here

+2

Zamiast publikować obraz tekstu, opublikuj właściwy tekst. – Sayse

+1

Zastąp swój wzór adresu URL administratorem tym jednym 'url (r '^ admin /', include (admin.site.urls))'. Również importuj - włącz 'from django.conf.urls import include' – kapilsdv

Odpowiedz

26

W 1.10, nie można już przejść ścieżki importu do url(), trzeba zdać rzeczywistą funkcję wyświetlania:

from posts.views import post_home 

urlpatterns = [ 
    ... 
    url(r'^posts/$', post_home), 
]   
+0

Dzięki za szybką reakcję i jest to doskonały sposób na zrobienie tego. Ale co musimy zrobić, gdy mamy więcej funkcji z tego samego widoku? wszelkie sugestie na ten sam temat? –

+0

Nie jestem do końca pewien, co masz na myśli. Więcej funkcji z tego samego modułu widoku? Jeśli tak, po prostu zaimportuj je wszystkie: 'from posts.views import post_home, other_view'. – knbk

+0

Co, jeśli używasz widoków opartych na klasach? –

2

Wymień wzór Admin URL z tym

url(r'^admin/', include(admin.site.urls)) 

Więc urls.py staje:

from django.conf.urls import url, include 
from django.contrib import admin 


urlpatterns = [ 
    url(r'^admin/', include(admin.site.urls)), 
    url(r'^posts/$', "posts.views.post_home"), #posts is module and post_home 
] 

Administrator adresy są wpłacone przez to (przed 1.9).

+0

' admin.site.urls' to jedyny przypadek, w którym nie powinieneś używać 'include()'. Wykonanie tego spowoduje ostrzeżenie o wycofaniu, ponieważ zmiany w 'include()' w 1.9 są niekompatybilne z działaniem 'admin.site.urls'. Sprawdź również [docs] (https://docs.djangoproject.com/en/1.9/ref/contrib/admin/#hooking-adminsite-instances-into-your-urlconf) na ten temat. – knbk

+0

Dokładnie .... Czytałem w dokumencie to samo. Nie powinniśmy używać include() dla administratora. Ale spróbowałem rozwiązania podanego przez kapil. –

+0

@knbk, masz rację, ale to nie jest niekompatybilne, a także nie podniesie żadnego ostrzeżenia o wycofaniu (na razie conajmniej) i tak, teraz nie jest to już konieczne. Dzięki. – kapilsdv

0

Odpowiedź jest w projektu-dir/urls.py

 
Including another URLconf 
    1. Import the include() function: from django.conf.urls import url, include 
    2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls')) 
0

Tylko w celu uzupełnienia odpowiedzi z @knbk, możemy użyć poniższego szablonu:

jak jest w 1,9:

from django.conf.urls import url, include 

urlpatterns = [ 
    url(r'^admin/', admin.site.urls), #it's not allowed to use the include() in the admin.urls 
    url(r'^posts/$', include(posts.views.post_home), 
] 

jak powinno być w 1.10:

from your_project_django.your_app_django.view import name_of_your_view 

urlpatterns = [ 
    ... 
    url(r'^name_of_the_view/$', name_of_the_view), 
] 

Pamiętaj, aby utworzyć w your_app_django >> views.py funkcję do renderowania widoku.

1

Dla Django 1.11.2
W głównym urls.py napisz:

from django.conf.urls import include,url 
from django.contrib import admin 

urlpatterns = [ 
    url(r'^admin/', admin.site.urls), 
    url(r'^posts/', include("Post.urls")), 
] 

A w appname/urls.py plików napisz:

from django.conf.urls import url 
from . import views 

urlpatterns = [ 
    url(r'^$',views.post_home), 
]