RuntimeError: Model class myapp.models.class doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS

This error has been addressed a lot of times but none of the answers seems to applied to me. I am fairly experienced with Python 2 and 3. I used django for the first time.I started making a project. As i was working with a basic DB and after i called the class.objects for the first time the title error occurred. After some time trying to fix it i moved to the django tutorial and i decided to do everything step by step. The error occured again specifically at "Writing your first Django app, part 3" right befor using render.

Directories:

\home_dir
   \lib
   \Scripts
   \src
      \.idea
      \pages
      \polls
         \migrations
         __init__.py
         admin.py
         apps.py
         models.py
         test.py
         views.py
      \templates
      \django_proj
         __init__.py
         asgi.py
         manage.py
         settings.py
         urls.py
         wsgi.py
      __init__.py
      db.sqlite3
      manage.py

Do not bother with pages it's a test app.

django_proj\settings.py:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django.contrib.sites',
    # My App
    'polls'
    'pages'
]

TEMPLATES and DATABASES are well configured

polls\apps.py:

from django.apps import AppConfig


class PollsConfig(AppConfig):
    name = 'polls'

polls\models.py

from django.db import models
from django.utils import timezone
import datetime


# Create your models here.
class Question(models.Model):
    question_text = models.CharField(max_length=200)
    published_date = models.DateTimeField('date published')
    objects = models.Manager()

    def __str__(self):
        return self.question_text

    def was_pub_recently(self):
        return self.published_date >= timezone.now() - datetime.timedelta(days=1)


class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    vote = models.IntegerField(default=0)

    def __str__(self):
        return self.choice_text

polls\views.py

from django.shortcuts import render
from django.http import HttpResponse
from src.polls.models import Question
from django.template import loader


# Create your views here.
def index(request, *args, **kwargs):
    latest_question_list = Question.objects.order_by('-published_date'[:5])
    template = loader.get_template('polls/index.html')
    context = {
        'latest_question_list': latest_question_list
    }
    return HttpResponse(template.render(context, request))


def details(request, question_id, *args, **kwargs):
    return HttpResponse(f"Question: {question_id}")


def results(request, question_id, *args, **kwargs):
    response = f"Results for question {question_id}"
    return HttpResponse(response)


def vote(request, question_id, *args, **kwargs):
    return HttpResponse(f"Vote on question {question_id}")

django_proj\urls.py

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

from src.pages.views import home_view, base_view, context_view
from src.polls.views import index, details, results, vote

urlpatterns = [
    path('', home_view, name='home'),
    path('admin/', admin.site.urls),
    path('base/', base_view, name='base'),
    path('context/', context_view, name="context"),
    # Polls
    path('home/', index, name='index'),
    path('<int:question_id>/', details, name='details'),
    path('<int:question_id>/results/', results, name='results'),
    path('<int:question_id>/vote/', vote, name='vote'),
]

Error:

Traceback (most recent call last):
  File "c:\users\panos\appdata\local\programs\python\python37-32\lib\threading.py", line 926, in _bootstrap_inner
    self.run()
  File "c:\users\panos\appdata\local\programs\python\python37-32\lib\threading.py", line 870, in run
    self._target(*self._args, **self._kwargs)
  File "C:\Users\panos\Dev\cfehome\lib\site-packages\django\utils\autoreload.py", line 53, in wrapper
    fn(*args, **kwargs)
  File "C:\Users\panos\Dev\cfehome\lib\site-packages\django\core\management\commands\runserver.py", line 117, in inner_run
    self.check(display_num_errors=True)
  File "C:\Users\panos\Dev\cfehome\lib\site-packages\django\core\management\base.py", line 395, in check
    include_deployment_checks=include_deployment_checks,
  File "C:\Users\panos\Dev\cfehome\lib\site-packages\django\core\management\base.py", line 382, in _run_checks
    return checks.run_checks(**kwargs)
  File "C:\Users\panos\Dev\cfehome\lib\site-packages\django\core\checks\registry.py", line 72, in run_checks
    new_errors = check(app_configs=app_configs)
  File "C:\Users\panos\Dev\cfehome\lib\site-packages\django\core\checks\urls.py", line 13, in check_url_config
    return check_resolver(resolver)
  File "C:\Users\panos\Dev\cfehome\lib\site-packages\django\core\checks\urls.py", line 23, in check_resolver
    return check_method()
  File "C:\Users\panos\Dev\cfehome\lib\site-packages\django\urls\resolvers.py", line 407, in check
    for pattern in self.url_patterns:
  File "C:\Users\panos\Dev\cfehome\lib\site-packages\django\utils\functional.py", line 48, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "C:\Users\panos\Dev\cfehome\lib\site-packages\django\urls\resolvers.py", line 588, in url_patterns
    patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module)
  File "C:\Users\panos\Dev\cfehome\lib\site-packages\django\utils\functional.py", line 48, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "C:\Users\panos\Dev\cfehome\lib\site-packages\django\urls\resolvers.py", line 581, in urlconf_module
    return import_module(self.urlconf_name)
  File "c:\users\panos\appdata\local\programs\python\python37-32\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\panos\Dev\cfehome\src\testdjango\urls.py", line 20, in <module>
    from src.polls.views import index, details, results, vote
  File "C:\Users\panos\Dev\cfehome\src\polls\views.py", line 3, in <module>
    from .models import Question
  File "C:\Users\panos\Dev\cfehome\src\polls\models.py", line 7, in <module>
    class Question(models.Model):
  File "C:\Users\panos\Dev\cfehome\lib\site-packages\django\db\models\base.py", line 115, in __new__
    "INSTALLED_APPS." % (module, name)
RuntimeError: Model class src.polls.models.Question doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS.

Python version 3.7

Django version 3.0.4

I have already tried:

https://medium.com/@michal.bock/fix-weird-exceptions-when-running-django-tests-f58def71b59a

Django model "doesn't declare an explicit app_label"

and other two solutions but i dont have the links

My speculation after 12 hours of trying to fix this is that is a compatibility issues or something really wrong with my imports and init files.

Edit. It seems like it was my mistake. For all those who encounter the same error firstly make sure you have your app into INSTALLED_APPS, next that all your files in you directories are well archived as django docs suggest (if you choose to make them in deferent way make sure you also fix your imports accordingly). Also don't use words in your names like django, test,.... because django's searchers may encounter them and override important django functions.

Upvotes: 4

Views: 13809

Answers (2)

huza
huza

Reputation: 1

I had the same problem for quite sometime. I was trying to import a model in a different app but got the runtime error saying the app is not explicitly declared. Later I realized all my apps are in subdirectory named after my project. That was all I had to tweak.

before: from myapp.models import Model

after: from myproject.myapp.models import Model

Upvotes: 0

veekaly
veekaly

Reputation: 250

Your INSTALLED_APPS list in django_proj\settings.py is incorrect. Each item in the list should be separated with commas. Try updating your list like below.

INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.sites',
# My App
'polls',
'pages',]

Upvotes: 12

Related Questions