Search code examples
pythondjangodjango-oscar

AttributeError: 'AppConfig' object has no attribute 'urls' when trying to runserver


I'm building a django based ecommerce project with oscar. I pip installed django-oscar and followed the official documentation guide to setup the settings.py and the root url.py files. When i try to runserver i get the following error:

AttributeError: 'AppConfig' object has no attribute 'urls'

I run on Windows 7, python 3.7.2, django 2.2.2, django-oscar 1.6.2

Below are my settings.py and url.py files:

Settings.py:


import os
from oscar.defaults import *

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))


SECRET_KEY = '###############################'

DEBUG = True

ALLOWED_HOSTS = []


from oscar import get_core_apps
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    "django.contrib.sites",
    "django.contrib.flatpages",
    "compressor",
    "widget_tweaks",
] + get_core_apps(['forked_apps.checkout'])

SITE_ID = 1
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    "oscar.apps.basket.middleware.BasketMiddleware",
    "django.contrib.flatpages.middleware.FlatpageFallbackMiddleware",
]

AUTHETICATION_BACKENDS = (
"oscar.apps.customer.auth_backends.EmailBackend",
"django.contrib.auth.backends.ModelBackend",
)

EMAIL_BACKEND = "django.core.mail.backends.console.EmailBackend"
ROOT_URLCONF = 'commehub_oscar.urls'

from oscar import OSCAR_MAIN_TEMPLATE_DIR

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR,"templates"),OSCAR_MAIN_TEMPLATE_DIR],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.template.context_processors.i18n',
                'django.contrib.messages.context_processors.messages',

                "oscar.apps.search.context_processors.search_form",
                "oscar.apps.promotions.context_processors.promotions",
                'oscar.apps.checkout.context_processors.checkout',
                "oscar.apps.customer.notifications.context_processors.notifications",
                "oscar.core.context_processors.metadata",

            ],
        },
    },
]

WSGI_APPLICATION = 'commehub_oscar.wsgi.application'


DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        'USER': '',
        'PASSWORD': '',
        'HOST': '',
        'PORT': '',
        'ATOMIC_REQUESTS': True,
    }
}

HAYSTACK_CONNECTIONS = {
"default":{
"ENGINE":"haystack.backends.simple_backend.SimpleEngine",
},
}


AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]


LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'

USE_I18N = True

USE_L10N = True

USE_TZ = True


STATIC_URL = '/static/'
MEDIA_URL = "/media/"
STATIC_ROOT = "static"
MEDIA_ROOT = "media"

OSCAR_INITIAL_ORDER_STATUS = 'Pending'
OSCAR_INITIAL_LINE_STATUS = 'Pending'
OSCAR_ORDER_STATUS_PIPELINE = {
    'Pending': ('Being processed', 'Cancelled',),
    'Being processed': ('Processed', 'Cancelled',),
    'Cancelled': (),
}

OSCAR_DEFAULT_CURRENCY = "NGN"

url.py

from django.conf.urls import include
from django.contrib import admin
from django.urls import path
from oscar.app import application
from django.conf import settings
from django.conf.urls.static import static
from django.apps import apps

urlpatterns = [
    path("i18n/",include('django.conf.urls.i18n')),
    path('admin/', admin.site.urls),
    # path("",application.urls),
    path('', include(apps.get_app_config('oscar').urls[0])),
]+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Here is the full error log

Exception in thread django-main-thread:
Traceback (most recent call last):
  File "C:\Users\user\Anaconda3\envs\mydjangoenv\lib\threading.py", line 917, in _bootstrap_inner
    self.run()
  File "C:\Users\user\Anaconda3\envs\mydjangoenv\lib\threading.py", line 865, in run
    self._target(*self._args, **self._kwargs)
  File "C:\Users\user\Anaconda3\envs\mydjangoenv\lib\site-packages\django\utils\autoreload.py", line 54, in wrapper
    fn(*args, **kwargs)
  File "C:\Users\user\Anaconda3\envs\mydjangoenv\lib\site-packages\django\core\management\commands\runserver.py", line 117,
in inner_run
    self.check(display_num_errors=True)
  File "C:\Users\user\Anaconda3\envs\mydjangoenv\lib\site-packages\django\core\management\base.py", line 390, in check

    include_deployment_checks=include_deployment_checks,
  File "C:\Users\user\Anaconda3\envs\mydjangoenv\lib\site-packages\django\core\management\base.py", line 377, in _run_checks

    return checks.run_checks(**kwargs)
  File "C:\Users\user\Anaconda3\envs\mydjangoenv\lib\site-packages\django\core\checks\registry.py", line 72, in run_checks
    new_errors = check(app_configs=app_configs)
  File "C:\Users\user\Anaconda3\envs\mydjangoenv\lib\site-packages\django\core\checks\urls.py", line 13, in check_url_config

    return check_resolver(resolver)
  File "C:\Users\user\Anaconda3\envs\mydjangoenv\lib\site-packages\django\core\checks\urls.py", line 23, in check_resolver
    return check_method()
  File "C:\Users\user\Anaconda3\envs\mydjangoenv\lib\site-packages\django\urls\resolvers.py", line 398, in check
    for pattern in self.url_patterns:
  File "C:\Users\user\Anaconda3\envs\mydjangoenv\lib\site-packages\django\utils\functional.py", line 80, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "C:\Users\user\Anaconda3\envs\mydjangoenv\lib\site-packages\django\urls\resolvers.py", line 579, in url_patterns
   patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module)
  File "C:\Users\user\Anaconda3\envs\mydjangoenv\lib\site-packages\django\utils\functional.py", line 80, in __get__

    res = instance.__dict__[self.name] = self.func(instance)
  File "C:\Users\user\Anaconda3\envs\mydjangoenv\lib\site-packages\django\urls\resolvers.py", line 572, in urlconf_module
    return import_module(self.urlconf_name)
  File "C:\Users\user\Anaconda3\envs\mydjangoenv\lib\importlib\__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
  File "<frozen importlib._bootstrap>", line 983, in _find_and_load
  File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 728, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "C:\Users\user\Desktop\python\my_django_stuffs\commehub_oscar\commehub_oscar\urls.py", line 29, in <module>
    path('', include(apps.get_app_config('oscar').urls[0])),
AttributeError: 'AppConfig' object has no attribute 'urls'



Solution

  • You are using the instructions for Oscar 2.0 with Oscar 1.6, and this is why it's not working for you.

    The way app configs are loaded in Oscar 2.0 changed significantly in Oscar 2.0, and is not backward compatible. Specifically, URLs in Oscar 1.6 are not loaded from the AppConfig object that you're currently trying to load them from.

    Documentation for version 1.6 is available at https://django-oscar.readthedocs.io/en/releases-1.6/internals/getting_started.html :

    from django.conf.urls import include, url
    from django.contrib import admin
    from oscar.app import application
    
    urlpatterns = [
        url(r'^i18n/', include('django.conf.urls.i18n')),
    
        # The Django admin is not officially supported; expect breakage.
        # Nonetheless, it's often useful for debugging.
        url(r'^admin/', include(admin.site.urls)),
    
        url(r'', include(application.urls)),
    ]