Je suis en train de parcourir le tutoriel standard de Django pour créer un administrateur pour une application. Après avoir commenté les éléments liés à l'administrateur dans les paramètres et exécuté syncdb, le message suivant s'affiche:
DoesNotExist at /admin/ Site matching query does not exist.
Quelqu'un peut-il m'aider à comprendre cela?
L'objet Site
de votre projet Django est manquant. Chaque projet Django a un objet Site
qui contient le nom du site et son domaine. Il est généralement créé automatiquement lors de la création d'un projet Django (en particulier lorsque la commande syncdb
est exécutée), mais dans votre cas, cela semble ne pas être arrivé.
Réparer:
Ouvrez le shell Django pour votre site (python manage.py Shell
).
Tapez ce qui suit:
>>> from Django.contrib.sites.models import Site
>>> Site.objects.create(name='example.com', domain='example.com')
Si vous souhaitez modifier ces valeurs ultérieurement, accédez à votre panneau d'administration (/admin/
) et modifiez l'objet de site dans la section Sites
.
Outre la réponse de Simeon Visser à ceux qui rencontrent encore des problèmes, assurez-vous que la variable SITE_ID
de vos paramètres correspond à l'ID de votre nouvel objet Site
- créé.
Lorsque vous incluez le Django.contrib.sites à votre INSTALLED_APPS et exécutez la commande "python manage.py migrate", l'application crée automatiquement un objet dans la table "Django_site" (avec le nom de domaine et le nom d'affichage égal à "exemple". com ". Il n'est pas nécessaire de le créer par vous-même.
Il vous suffit probablement d’ajouter le paramètre SITE_ID = 1 à votre fichier settings.py.
Si vous avez déjà example.com dans la table des sites après votre exécution
python manage.py migrate
Vous devez obtenir l'identifiant de cette entrée.
Pour obtenir l'ID, vous pouvez faire -
python manage.py Shell
from Django.contrib.sites.models import Site
print Site.objects.get(name='example.com').id
Obtenez l'identifiant que vous obtenez ici dans setting.py
. Par exemple.
SITE_ID = 8
Fondamentalement, l'ID dans la table correspondant au site de tournée et dans le fichier settings.py doit correspondre.
Vous pouvez également envisager d'utiliser la fonctionnalité de fixation de Django pour remplir automatiquement les données: https://docs.djangoproject.com/en/dev/howto/initial-data/
[
{
"model" : "sites.site",
"pk" : 1,
"fields": {
"name" : "example.com",
"domain" : "127.0.0.1:8010"
}
}
]
commentez Django.contrib.sites à partir des applications installées. c'est à dire.
#'Django.contrib.sites',
Si vous utilisez les fixtures South et initial_data, les données pourraient ne pas être chargées correctement. Pour le réparer, ajoutez
if 'test' in sys.argv or 'jenkins' in sys.argv:
SOUTH_TESTS_MIGRATE = False
à la fin de votre fichier de paramètres
Un objet de site est manquant, vous devez donc ajouter un objet de site.
Solution:
ouvrez Django Shell (python manage.py Shell):
In [1]: from Django.contrib.sites.models import Site
In [2]: Site.objects.create(name='example.com',domain='example.com').save()
In [3]: s=Site.objects.filter(name='example.com')[0]
In [4]: s.id
Out[4]: 3
puis ouvrez votre fichier settings.py
et ajoutez SITE_ID = 3
mettez cette valeur dans SITE_ID
= que vous obtenez après (s.id
)
Parfois, si vous ajoutez plusieurs sites via Admin et en supprimez certains, chaque site a un identifiant. Cela ne fonctionnait pas pour moi une fois que j'ai changé l'identifiant dans la base de données, il a donc commencé à fonctionner. Assurez-vous que SITE_ID correspond à l'identifiant de la base de données.
Je suis un novice Django. J'ai eu la même erreur en parcourant le tutoriel. Ma table de base de données Django_site
était vide. J'ai choisi de supprimer toutes les tables nommées "Django_ *". Ensuite, lorsque j'ai réécrit syncdb
, les tables Django manquantes ont été créées et la table de base de données Django_site
a été remplie avec id = 1, domain = example.com, name = example.com. Il est évident que la classe Site
est sauvegardée par la table de base de données Django_site
. Maintenant, je comprends le problème et la solution ci-dessus qui a rempli la table en utilisant la méthode Site.objects.create()
. Merci Siméon.