Getting Site Matching Query Does Not Exist Error a

2019-01-16 09:25发布

问题:

I'm going through the standard Django tutorial to create an admin for an app. After commenting the admin related stuff in settings and running syncdb I'm getting this message:

DoesNotExist at /admin/ Site matching query does not exist.

Can anyone help me figure this out?

回答1:

The Site object for your Django project is missing. Each Django project has a Site object which contains the site's name and domain. It is usually automatically created when creating a Django project (in particular, when the syncdb command runs) but in your case it seems that didn't happen.

To fix it:

Open the Django shell for your site (python manage.py shell).

Type the following:

>>> from django.contrib.sites.models import Site
>>> Site.objects.create(name='example.com', domain='example.com')

If you want to change these values later, go to your admin panel (/admin/) and edit the site object in the section Sites.



回答2:

In addition to Simeon Visser's answer for those of you still experiencing problems, make sure the SITE_ID variable in your settings matches the ID of your newly created Site-object.



回答3:

When you include the django.contrib.sites to your INSTALLED_APPS and run the command "python manage.py migrate" the app automatically creates a object into "django_site" table (with domain name and display name equals to "example.com". There is no need to create it by yourself.

Probably you just need to add the setting SITE_ID = 1 to your settings.py file.



回答4:

You could also consider of using fixture feature of django to populate the data automatically: https://docs.djangoproject.com/en/dev/howto/initial-data/

[
    {
        "model" : "sites.site",
        "pk" : 1,
        "fields": {
            "name"  : "example.com",
            "domain" : "127.0.0.1:8010"
        }
    }
]


回答5:

comment out django.contrib.sites from the installed apps. i.e.

#'django.contrib.sites',


回答6:

If you already have example.com in your sites table after you run

python manage.py migrate

You need to get id of this entry.

To get the ID you can do -

python manage.py  shell
from django.contrib.sites.models import Site
print Site.objects.get(name='example.com').id

Get the id you get here into setting.py . Eg.

SITE_ID = 8

Basically ID in table corresponding yo tour site and in the settings.py should match.



回答7:

I'm a Django newbie. I got the same error when going through the tutorial. My django_site DB table was empty. I chose to drop all tables named "django_*". Then when I reran syncdb, the missing django tables were created, and the django_site DB table was populated with id=1, domain=example.com, name=example.com. Evidently the Site class is backed by the django_site DB table. Now I understand the problem and the solution above that populated the table using the Site.objects.create() method. Thanks Simeon.



回答8:

If you use South and initial_data fixtures, data could be loaded not properly. To fix it add

if 'test' in sys.argv or 'jenkins' in sys.argv:
    SOUTH_TESTS_MIGRATE = False

at the end of your settings file



回答9:

Sometimes if you add more Sites via Admin and delete some of them each site has an ID, it was not working for me once I changed the ID in the DB it started working, so make sure SITE_ID matches the ID in the database.