创建 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 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
然后打开您的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 后获取站点匹配查询不存在错误的主要内容,如果未能解决你的问题,请参考以下文章