创建 django admin 后获取站点匹配查询不存在错误

Posted

技术标签:

【中文标题】创建 django admin 后获取站点匹配查询不存在错误【英文标题】:Getting Site Matching Query Does Not Exist Error after creating django admin 【发布时间】:2012-07-13 15:24:39 【问题描述】:

我正在通过标准 Django 教程为应用创建管理员。在设置中评论与管理员相关的内容并运行 syncdb 后,我收到以下消息:

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

谁能帮我解决这个问题?

【问题讨论】:

【参考方案1】:

您的 Django 项目的 Site 对象丢失。每个 Django 项目都有一个 Site 对象,其中包含站点的名称和域。它通常在创建 Django 项目时自动创建(特别是在运行 syncdb 命令时),但在您的情况下似乎没有发生。

修复它:

为您的站点打开 Django shell (python manage.py shell)。

键入以下内容:

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

如果您想稍后更改这些值,请转到您的管理面板 (/admin/) 并在 Sites 部分中编辑站点对象。

【讨论】:

非常感谢。只是为了澄清应该在创建站点的哪个时间点创建站点对象?当你这样做时:django-admin.py startproject mysite? @DavidHaddad:我刚刚检查了 Django 源代码,它发生在 syncdb 命令创建表之后。如果您的项目随后使用了django.contrib.sites 插件,那么它将运行一些代码来创建Site 对象。 甜蜜,正是在运行syncdb之后引发了错误。再次感谢。 还必须更改 settings.py 中的 SITE_ID 在创建名为“example.com”的站点对象后,仍然出现错误。请帮忙【参考方案2】:

除了 Simeon Visser 对那些仍然遇到问题的人的回答之外,请确保您的设置中的 SITE_ID 变量与您新创建的 Site-object 的 ID 匹配。

【讨论】:

绝对值得注意的是,对于 django 1.8,在添加 contrib.sites 后迁移确实会添加一个站点,但您必须添加 SITE_ID 设置。甚至不需要 Simeon 的答案 - 只需 SITE_ID 到 1。 如果您像我刚刚删除 SITE_ID 1 的记录那样搞砸了,只需在 shell 中创建 id=1 的新记录。【参考方案3】:

当您将 django.contrib.sites 包含到您的 INSTALLED_APPS 并运行命令“python manage.py migrate”时,应用程序会自动在“django_site”表中创建一个对象(带有域名和显示name等于“example.com”,不需要自己创建。

您可能只需将设置 SITE_ID = 1 添加到您的 settings.py 文件中。

【讨论】:

【参考方案4】:

如果运行后您的站点表中已有 example.com

python manage.py migrate

您需要获取此条目的 id。

要得到你可以做的ID -

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

将您在此处获取的 id 获取到 setting.py 。例如。

SITE_ID = 8

基本上对应你旅游站点的表中的ID和settings.py中的ID应该匹配。

【讨论】:

【参考方案5】:

从已安装的应用程序中注释掉 django.contrib.sites。即

#'django.contrib.sites',

【讨论】:

这解决了我的问题,因为我一直在使用我的设置来尝试让一个包工作。 是的。 +1。虽然不一定是需要网站的人的解决方案;这对于诊断问题所在非常有帮助。【参考方案6】:

您也可以考虑使用 django 的夹具功能自动填充数据:https://docs.djangoproject.com/en/dev/howto/initial-data/

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

【讨论】:

【参考方案7】:

缺少站点对象,因此您必须添加 1 个站点对象

解决方案:

打开 Django shell(python ma​​nage.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

然后打开您的settings.py 文件并添加SITE_ID = 3 将该值放入 SITE_ID = 你之后得到的 (s.id)

【讨论】:

【参考方案8】:

我是 Django 新手。我在阅读教程时遇到了同样的错误。我的django_site DB 表是空的。我选择删除所有名为“django_*”的表。然后,当我重新运行syncdb 时,创建了丢失的 django 表,并使用 id=1、domain=example.com、name=example.com 填充了django_site DB 表。显然Site 类由django_site DB 表支持。现在我了解了使用Site.objects.create() 方法填充表格的问题和上述解决方案。谢谢西蒙。

【讨论】:

【参考方案9】:

如果您使用 South 和 initial_data 固定装置,数据可能无法正确加载。要修复它,请添加

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

在设置文件的末尾

【讨论】:

【参考方案10】:

有时,如果您通过管理员添加更多站点并删除其中一些站点,每个站点都有一个 ID,一旦我更改了它开始工作的数据库中的 ID,它就无法正常工作,因此请确保 SITE_ID 与数据库中的 ID 匹配.

【讨论】:

【参考方案11】:

我也为同样的错误苦苦挣扎了很长一段时间。我错误地从管理员的站点目录中删除了 example.com。一旦我使用上述解决方案添加了站点,它就可以工作了。当我创建 example.com 时,site_id 也自动变为 2,因此也必须在我的设置文件中将 site_id 更改为 2。谢谢。

【讨论】:

【参考方案12】:

这完全是由于您不小心从默认情况下(example.com)的 django 管理站点中删除了站点。下面提到的代码也引发了运行时错误。

from django.contrib.sites.models import Site

所以只需在您的SITE_ID 中增加1 例如,如果默认情况下它是1,而不是用2 更改它 从改变 SITE_ID = 1 到: SITE_ID = 2

【讨论】:

【参考方案13】:
from django.contrib.sites.models import Site
Site.objects.create(name='example.com', domain='example.com')

以上解决了问题。

但是当我登录管理面板时,还有另一个站点 example.com,所以我相信如果有人将 SITE_ID = 2 这也可以。

【讨论】:

以上是关于创建 django admin 后获取站点匹配查询不存在错误的主要内容,如果未能解决你的问题,请参考以下文章

Django 中Admin站点的配置

django之admin站点

django admin - 匹配的查询不存在

Django学习:创建admin后台管理站点

将现有站点更新为新的 Django 1.5 用户模型后 django_admin_log 上的完整性错误

django基础知识之后台管理Admin站点: