web-dev-qa-db-fra.com

L'obtention de la requête de correspondance de site n'existe pas Erreur après la création de l'administrateur Django

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?

51
David Haddad

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.

104
Simeon Visser

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éé.

35
0sh

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. 

24
Ricardo Silva

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.

4
Aniket Thakur

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"
        }
    }
]
4
Miao ZhiCheng

commentez Django.contrib.sites à partir des applications installées. c'est à dire. 

#'Django.contrib.sites',
4
Ikechukwu Henry Odoh

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

0
eviltnan

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)

0
Rahul Singh

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.

0
Radek

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.

0
Phil Friesen