RuntimeError: Die Modellklasse django.contrib.sites.models.Site deklariert kein explizites app_label und befindet sich nicht in einer Anwendung in INSTALLED_APPS

74

Ich erstelle eine Anwendung mit Django Rest Framework und AngularJs. Ich verwende Django-rest-auth für meine Authentifizierungszwecke, konnte es jedoch nicht einrichten. Wie auch immer, ich versuche diese App mit meinem Projekt einzurichten . Ich erkannte, dass ich django-rest-auth-register installieren muss, um es zum Laufen zu bringen, und befolgte diese Dokumentation , um die folgenden Dinge zu tun:

Ich habe die Befehle ausgeführt

pip install django-rest-auth

und

pip installiere django-allauth

Alle meine settings.py sehen so aus:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    # 3rd party apps
    'rest_framework',
    'rest_framework.authtoken',
    'rest_auth',
    'allauth',
    'allauth.account',
    'rest_auth.registration',

    # My app
    'myapp',
]

Ich habe auch die Authentifizierungs-Backends, context_processors und die richtigen URLs hinzugefügt.

Wenn ich jedoch versuche zu migrieren, gibt mein Terminal den folgenden Fehler aus:

RuntimeError: Die Modellklasse django.contrib.sites.models.Site deklariert kein explizites app_label und befindet sich nicht in einer Anwendung in INSTALLED_APPS.

Warum erhalte ich diesen Fehler und wie löse ich ihn, um mein Projekt zu migrieren? Vielen Dank!

Dunkles Pferd
quelle

Antworten:

191

Die Reparatur

Fügen Sie einfach das Sites-Framework von Django zu Ihren Apps hinzu und setzen Sie SITE_ID in Ihren Einstellungen auf 1.

INSTALLED_APPS = [
    ...
    'django.contrib.sites',
]

SITE_ID = 1

Warum passiert das?

Das Sites Framework von Django ist ein mit der Kernbibliothek gebündeltes Modul, das die Verwendung einer einzelnen Django-Anwendung / Codebasis mit verschiedenen Sites ermöglicht (die unterschiedliche Datenbanken, Logik in Ansichten usw. verwenden können). Die Einstellung SITE_ID , wie in den Dokumenten angegeben, " wird verwendet, damit Anwendungsdaten in bestimmte Sites eingebunden werden können und eine einzelne Datenbank Inhalte für mehrere Sites verwalten kann ."

In diesem speziellen Fall benötigt AllAuth das Sites Framework, um ordnungsgemäß zu funktionieren. Viele andere Bibliotheken von Drittanbietern wurden entwickelt, um Fälle sicher zu behandeln, in denen mehrere Sites vorhanden sein können und als solche am besten geeignet sind.

Ian Price
quelle
1
Es behebt das Problem, aber woher kommt es?
Erikbwork
1
Das Sites Framework von Django ist ein mit der Kernbibliothek gebündeltes Modul, das die Verwendung einer einzelnen Django-Anwendung / Codebasis mit verschiedenen Sites ermöglicht (die unterschiedliche Datenbanken, Logik in Ansichten usw. verwenden können). In diesem speziellen Fall benötigt AllAuth das Sites Framework, um ordnungsgemäß zu funktionieren (wie viele andere Bibliotheken von Drittanbietern, die für die sichere Behandlung von Fällen entwickelt wurden, in denen möglicherweise mehrere Sites vorhanden sind).
Ian Price
2018 brauchst du keine SITE_ID mehr und trotzdem habe ich dieses Problem
holms
Obwohl ich 'django.contrib.sites' und SITE_ID = 1 habe, habe ich immer noch dieses Problem.
Ross Symonds
11

Ich bin über die Google-Suche auf diesen Beitrag gestoßen. Mein Problem war das Ausführen von Tests, die mit dem Fehler explodierten:

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

Dies lief unter Python 2.7.x mit absoluten Importen. Wie von Colton Hicks in den Kommentaren unten erwähnt, kann dies auch mit Python 3 geschehen (Pytest 3.2.3 mit Django 1.11.4).

In meinem tests.py:

from __future__ import absolute_import
[...]
from .models import Demographics, Term

Nachdem der relative Import in einen absoluten Import geändert wurde, verschwand das Problem:

from taxonomy.models import Demographics, Term

HTH

berto
quelle
Hatte ein ähnliches Problem, aber Python3 ausgeführt. In meiner Datei tests.py habe ich einen relativen Import einer Ansicht verwendet, die ich testen wollte from .views import LatestAccount. Der Fehler, den ich bekam, war nicht einmal für ein Modell, das in der Datei tests.py verwendet wurde. Das Entfernen dieses relativen Imports und das Ersetzen durch einen absoluten Import behebt das Problem.
Colton Hicks
@ColtonHicks mit welchem ​​Testläufer ist das passiert? Ich werde Ihre Python3-Ergebnisse an meine Antwort anpassen.
Berto
Ich habe pytest 3.2.3 in einer Django 1.11.4-App verwendet.
Colton Hicks
3

Ich habe den Fehler oben bekommen. Mein Problem war jedoch das in der urls.py. Ich folgte PyDanny Ausstecher Django Rezept. Mein Fehler war, in die urls.py diese Zeile einzufügen:

    url(r'^demo/', include('project.demoapp.urls', namespace='demoapp')),

als ich das korrigierte:

    url(r'^demo/', include('demoapp.urls', namespace='demoapp')),

alles war gut. Ich habe auch meine lokalen Apps geändert (ich habe dies zuerst getan und daher war der kritische Fehler die URL-Fehlkonfiguration):

LOCAL_APPS = [
    # Your stuff: custom apps go here
    'demoapp.apps.DemoAppConfig',
]
hum3
quelle
2

Fügen Sie einfach 'django.contrib.sites',auf INSTALLED_APPSund legen Sie SITE_ID = 1in Ihrer settings.pyDatei.

Ahmed Adewale
quelle
1

Versuchen Sie, die app_label = 'yourApp'Meta-Klasse in den Modellen hinzuzufügen :

class Meta:

    app_label = 'yourApp'
PowerAktar
quelle