Không đúng cáchConfiguredError về app_name khi sử dụng không gian tên trong include ()


104

Tôi hiện đang dùng thử Django. Tôi sử dụng namespaceđối số trong một trong các include()s của tôi trong urls.py. Khi tôi chạy máy chủ và cố gắng duyệt, tôi gặp lỗi này.

File "C:\Users\User\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\urls\conf.py", line 39, in include
    'Specifying a namespace in include() without providing an app_name '
django.core.exceptions.ImproperlyConfigured: Specifying a namespace in include() without providing an app_name is not supported. Set the app_name attribute in the included module, or pass a 2-tuple containing the list of patterns and app_name instead.

Đây là các tệp urls.py của tôi:

#project/urls.py

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

urlpatterns = [
    url(r'^reviews/', include('reviews.urls', namespace='reviews')),
    url(r'^admin/', include(admin.site.urls)),
]

#app/urls.py

from django.conf.urls import url

from . import views

urlpatterns = [
    # ex: /
    url(r'^$', views.review_list, name='review_list'),
    # ex: /review/5/
    url(r'^review/(?P<review_id>[0-9]+)/$', views.review_detail, name='review_detail'),
    # ex: /wine/
    url(r'^wine$', views.wine_list, name='wine_list'),
    # ex: /wine/5/
    url(r'^wine/(?P<wine_id>[0-9]+)/$', views.wine_detail, name='wine_detail'),
]

Tôi phải làm gì app_namenhư đã nêu trong thông báo lỗi?

Câu trả lời:


152

Kiểm tra các tài liệu để bao gồm ở đây .

Những gì bạn đã làm không phải là cách chấp nhận được để chuyển các tham số để đưa vào. Bạn có thể làm:

url(r'^reviews/', include(('reviews.urls', 'reviews'), namespace='reviews')),

Vừa thử cái này và gặp một lỗi khác ... url (r '^ reviews /', include ('reviews.urls', namespace = 'reviews', app_name = 'reviews')), TypeError: include () có lỗi không mong muốn đối số từ khóa 'app_name'
Nelson M

1
Vô cùng xin lỗi. Điều đó được cho là được sử dụng với các mô-đun không phải là các mẫu. Vui lòng kiểm tra câu trả lời được cập nhật.
unixia

1
Giải pháp này cũng hữu ích cho tôi. Tôi đã làm theo hướng dẫn từ django-oauth-toolkit.readthedocs.io/en/latest/tutorial/… và có một hướng dẫn để thực hiện: urlpatterns = [# OAuth 2 endpoints: url (r '^ o /', include ( oauth2_endpoint_views, namespace = "oauth2_provider")), url (r '^ api / hello', ApiEndpoint.as_view ()), # điểm cuối tài nguyên mẫu]. Điều này tạo ra cùng một lỗi như bạn đã đề cập.
Koji D'infinte

1
Cú pháp tuple không hoạt động đối với tôi, nó chỉ hoạt động khi tôi thay đổi (phiên bản của tôi) reviews.urlđể có một app_namebiến trong đó django 2.1.
Herbert

Trường hợp sử dụng cho điều này là gì? Tôi có rất nhiều url bao gồm trong dự án của mình và tất cả đều có cùng một mẫu: path("the_app/", include(("app.urls", <name>), namespace=<the same name>))và nó khá khó chịu.
user4052054

80

Django 1.11+, 2.0+

Bạn nên đặt app_name trong tệp url mà bạn đang bao gồm

# reviews/urls.py  <-- i.e. in your app's urls.py

app_name = 'reviews'
     

Sau đó, bạn có thể bao gồm nó theo cách bạn đang làm.

Ngoài ra, có thể cần lưu ý những gì tài liệu Django nói ở đây https://docs.djangoproject.com/en/1.11/ref/urls/#include :

Không được dùng nữa kể từ phiên bản 1.9: Hỗ trợ cho đối số app_name không được dùng nữa và sẽ bị xóa trong Django 2.0. Chỉ định app_name như được giải thích trong không gian tên URL và thay vào đó là URLconfs.

( https://docs.djangoproject.com/en/1.11/topics/http/urls/#namespaces-and-include )


32

Django 2.0 bạn nên chỉ định app_name trong urls.py của mình , không cần thiết phải chỉ định đối số app_name trên include.

Tệp Url chính.

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('', include('apps.main.urls')),
    path('admin/', admin.site.urls),
]

Url được bao gồm.

from django.urls import path
from . import views

app_name = 'main_app'

urlpatterns = [
    path('', views.index, name='index'),
]

Sau đó, sử dụng sử dụng trong mẫu như

<a href="{% url main_app:index' %}"> link </a>

Thêm chi tiết: https://code.djangoproject.com/ticket/28691 Django 2.0 Docs


2
Tôi tự hỏi, việc sử dụng app_name = "main" là gì? và làm thế nào django sử dụng biến này
Kanishk Tanwar

4

Tôi đã đưa vào một thư viện chưa tương thích (hoàn toàn) django 2.1 (django_auth_pro_saml2). Do đó tôi tạo tệp thứ hai saml_urls.py:

from django_saml2_pro_auth.urls import urlpatterns

app_name = 'saml'

Để tôi có thể bao gồm các url như:

from django.urls import include, re_path as url

urlpatterns = [
    ..., url(r'', include('your_app.saml_urls', namespace='saml')), ...
]

Hacky, nhưng nó hoạt động với tôi, trong khi url(r'^reviews/', include(('reviews.urls', 'reviews'), namespace='reviews'))nó không.


0

Tôi cũng gặp phải lỗi tương tự trong Django 2.2 và tôi giải quyết nó theo cách này

tệp urls.py

urlpatterns = [
   path('publisher-polls/', include('polls.urls', namespace='publisher-polls')),
]

polls / urls.py tệp

app_name = 'polls'
urlpatterns = [
  path('', views.IndexView.as_view(), name='index')
]

ví dụ sử dụng không gian tên trong phương pháp xem dựa trên calss

def get_absolute_url(self):
    from django.urls import reverse
    return reverse('polls.index', args=[str(self.id)])

ví dụ sử dụng không gian tên trong các mẫu

{% url 'polls:index' %}

Đây là cuộc thăm dò: index mean app_name [định nghĩa trong cuộc thăm dò / tệp urls.py ]: tên [xác định trong cuộc thăm dò / tệp urls.py tệp bên trong hàm đường dẫn]

chính thức của họ khá tốt, bạn có thể kiểm tra để biết thêm thông tin namespace_django_official_doc


-6

Trong trường hợp của tôi, tôi đã viết các url bên ngoài danh sách urlpatterns. Xin vui lòng kiểm tra lại.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.