Search code examples
djangourl-patternlanguage-translation

name 'urlpatterns' is not defined when doing translation (+= i18n_patterns)


I want to add a language prefix in URL patterns just like the django documentation homepage. Following this example my urls.py looks like this:

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

from myapp import views
from myapp.views import MyFirstView, MySecondView

myapp_patterns = [
    url(r'^$', views.CategoryView, name='index'),
    url(r'^(?P<name>[a-zA-Z0-9_]+)/$', MyFirstView.as_view(), name='detail'),
    url(r'^(?P<name>[a-zA-Z0-9_]+)/mysecond_view/$', MySecondView, name='mysecond_view')
]

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^categories/', include(myapp_patterns)),
    url(r'^', views.LandingView),
]

This works but now when I add += i18n_patterns

urlpatterns += i18n_patterns [
    url(r'^admin/', admin.site.urls),
    url(r'^categories/', include(myapp_patterns)),
    url(r'^', views.LandingView),
]

I get the error: NameError: name 'urlpatterns' is not defined

I did add the LocalMiddleware:

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.locale.LocaleMiddleware',
    'django.middleware.common.CommonMiddleware',
    ...
]

as well as this:

LANGUAGE_CODE = 'en-us'

USE_I18N = True

USE_L10N = True

LOCALE_PATHS = (
        os.path.join(BASE_DIR, 'locale'),
)

I don't understand how urlpatterns all of the sudden is not defined anymore. What am I doing wrong here?


Solution

  • Primarily because of +=. There's no previous definition of urlpatterns.

    You should start of with assignment = to define it.