相关文章推荐
无聊的松鼠  ·  python ...·  1 年前    · 
Collectives™ on Stack Overflow

Find centralized, trusted content and collaborate around the technologies you use most.

Learn more about Collectives

Teams

Q&A for work

Connect and share knowledge within a single location that is structured and easy to search.

Learn more about Teams

[A similar question was asked, but not marked as answered, here . I considered continuing that thread but the website told me I'm only supposed to post an answer, so it seems I have to start a new topic.] I'm trying to follow this tutorial and I'm having problems with the URL mapping. Specifically with the part described as "So best practice is to create an “url.py” per application and to include it in our main projects url.py file". The relevant, I hope, part of the folder structure, which arose by following steps of the tutorial to the letter (if possible; usage of the 'patterns' module was impossible for example) and using Django 1.10 is the following:

myproject/
  myapp/
    urls.py
    views.py
  myproject/
    urls.py

The myproject/urls.py is as follows:

from django.conf.urls import include, url
from django.contrib import admin
admin.autodiscover()
from myapp.views import hello
urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
url(r'^myapp/', include(myapp.urls)),

The myapp/urls.py is as follows:

from django.conf.urls import include, url
urlpatterns = [
    url(r'^hello/', myapp.views.hello),

The myapp/views.py is as follows:

from django.shortcuts import render
def hello(request):
   return render(request, "hello.html", {})

However, running 'python manage.py runserver' results in the following error:

url(r'^myapp/', include(myapp.urls)),
NameError: name 'myapp' is not defined

INSTALLED_APPS in settings.py contains 'myapp'.

I'd be greatful for any tips on how to deal with the NameError! [Or any tips whatsoever that anyone might consider to be helpful!]

Thank you for the comment. Django 1.10 seems to be the "latest official version" according to the Django website. I thought it'be reasonable to install it. I don't know what 'class based views' are. I will investigate. But are you confident this is the root of the NameError? – Leszek Wroński Nov 8, 2016 at 11:09 The tutorial you linked to is written for Django 1.6 or earlier (admin.autodiscover() has not been required since Django 1.7) . A lot has changed since then, so I wouldn't recommend following it. The official Django 1.10 tutorial shows you how to create an app with a url config which will work with Django 1.10. – Alasdair Nov 8, 2016 at 11:36

You have the NameError because you are referencing myapp in myproject/urls.py but haven't imported it.

The typical approach in Django is to use a string with include, which means that the import is not required.

url(r'^myapp/', include('myapp.urls')),

Since you have move the hello URL pattern into myapp/urls.py, you can remove from myapp.views import hello from myproject/urls.py.

Once you've made that change, you will get another NameError in myapp/urls.py. In this case, a common approach is to use a relative import for the app's views.

from django.conf.urls import url
from . import views
urlpatterns = [
    url(r'^hello/$', views.hello),
                I also ran into this issue upgrading to Django 2.0+ and the relative . import fixed my issue for an installed app view. Thanks!
– RoboBear
                Jul 31, 2018 at 20:30

Make sure you have imported following modules to urls.py.

from django.conf.urls import url
from django.contrib import admin
urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
url(r'^myapp/', include('myapp.urls')),

also, note that from python 2 upward the regular expression is not needed. change URL to path from django.conf.URLs import include path

from Django.contrib import admin admin.autodiscover()

from myapp.views import hello

urlpatterns = [
path('^admin/', include(admin.site.urls)),
path('^myapp/', include('myapp.urls')),

I have followed @Alasdair answers

You have the NameError because you are referencing myapp in myproject/urls.py but haven't imported it.

The typical approach in Django is to use a string with include, which means that the import is not required.

Unfortunately, it didn't work out(I still got the name X is not defined error). Here is how I do it.

from django.contrib import admin
from django.urls import include
from django.conf.urls import url
from article import urls as article_users
from article import urls as user_urls 
urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/article/', include(article_users)),
    path('api/user/', include(user_urls)),

Before using the URL command be sure to first import the url from the module Urls. Then try using the runserver.

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

Thanks for contributing an answer to Stack Overflow!

  • Please be sure to answer the question. Provide details and share your research!

But avoid

  • Asking for help, clarification, or responding to other answers.
  • Making statements based on opinion; back them up with references or personal experience.

To learn more, see our tips on writing great answers.