ImproperlyConfiguredError tentang app_name saat menggunakan namespace di include ()

105

Saya saat ini mencoba Django. Saya menggunakan namespaceargumen di salah satu include()s saya di urls.py. Ketika saya menjalankan server dan mencoba menjelajah, saya mendapatkan kesalahan ini.

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.

Ini adalah file urls.py saya:

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

dan

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

Apa yang harus saya sampaikan app_nameseperti yang dinyatakan dalam pesan kesalahan?

Nelson M
sumber

Jawaban:

152

Periksa dokumen untuk disertakan di sini .

Apa yang telah Anda lakukan bukanlah cara yang dapat diterima untuk meneruskan parameter untuk disertakan. Anda bisa melakukan:

url(r'^reviews/', include(('reviews.urls', 'reviews'), namespace='reviews')),
unixia
sumber
Baru saja mencoba ini dan mendapat kesalahan lagi ... url (r '^ reviews /', include ('reviews.urls', namespace = 'reviews', app_name = 'reviews')), TypeError: include () mendapat pesan yang tidak terduga argumen kata kunci 'app_name'
Nelson M
1
Sangat menyesal. Itu seharusnya digunakan dengan modul, bukan pola. Silakan periksa jawaban yang diperbarui.
unixia
1
Solusi ini juga bermanfaat bagi saya. Saya mengikuti tutorial dari django-oauth-toolkit.readthedocs.io/en/latest/tutorial/… dan ada instruksi yang harus dilakukan: urlpatterns = [# OAuth 2 endpoints: url (r '^ o /', include ( oauth2_endpoint_views, namespace = "oauth2_provider")), url (r '^ api / hello', ApiEndpoint.as_view ()), # contoh titik akhir sumber daya]. Ini menghasilkan kesalahan yang sama seperti yang Anda sebutkan.
Koji D'infinte
1
Tuple-syntax tidak bekerja untuk saya, itu hanya bekerja ketika saya mengubah (versi saya) reviews.urluntuk memasukkan app_namevariabel django 2.1.
Herbert
Apa kasus penggunaan untuk ini? Saya memiliki banyak url yang disertakan dalam proyek saya dan semuanya dengan pola yang sama: path("the_app/", include(("app.urls", <name>), namespace=<the same name>))dan itu cukup mengganggu.
pengguna4052054
80

Django 1.11+, 2.0+

Anda harus menyetel app_name di file url yang Anda sertakan

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

app_name = 'reviews'
     

Kemudian Anda dapat memasukkannya seperti yang Anda lakukan.

Juga, mungkin perlu diperhatikan apa yang dikatakan dokumen Django di sini https://docs.djangoproject.com/en/1.11/ref/urls/#include :

Tidak digunakan lagi sejak versi 1.9: Dukungan untuk argumen app_name tidak digunakan lagi dan akan dihapus di Django 2.0. Tentukan app_name seperti yang dijelaskan di ruang nama URL dan URLconf yang disertakan sebagai gantinya.

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

Bob
sumber
32

Django 2.0 Anda harus menetapkan app_name di urls.py Anda , tidak perlu untuk menetapkan argumen app_name pada penyertaan.

File Url utama.

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

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

Url yang disertakan.

from django.urls import path
from . import views

app_name = 'main_app'

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

Kemudian gunakan gunakan di template as

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

Detil lebih lanjut: https://code.djangoproject.com/ticket/28691 Django 2.0 Docs

Brayan Loayza
sumber
2
saya bertanya-tanya, apa gunanya app_name = "main" ini? dan bagaimana django menggunakan variabel ini
Kanishk Tanwar
4

Saya menyertakan pustaka yang belum (sepenuhnya) kompatibel dengan django 2.1 (django_auth_pro_saml2). Karenanya saya membuat file kedua saml_urls.py:

from django_saml2_pro_auth.urls import urlpatterns

app_name = 'saml'

Sehingga saya bisa memasukkan url sebagai:

from django.urls import include, re_path as url

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

Hacky, tetapi berhasil untuk saya, sedangkan yang url(r'^reviews/', include(('reviews.urls', 'reviews'), namespace='reviews'))tidak.

Herbert
sumber
0

Saya juga menghadapi kesalahan yang sama di Django 2.2 dan saya menyelesaikannya dengan cara ini

file urls.py

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

file polls / urls.py

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

contoh penggunaan namespace dalam metode tampilan berbasis cals

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

contoh penggunaan namespace di template

{% url 'polls:index' %}

Berikut polling: indeks berarti app_name [definisikan di file polls / urls.py ]: nama [definisikan di file polls / urls.py di dalam fungsi jalur]

resmi mereka yang cukup bagus Anda dapat memeriksa info lebih lanjut namespace_django_official_doc

sayalok
sumber