当我最初在syncdb之后运行时,我想填充django_site表我该怎么做我只有一个站点
3 回答
简单的解决方案是为站点应用程序创建一个 initial_data.json 固定装置,该固定装置将覆盖默认值。
例如,我在 /myproject/myapp/fixtures/initial_data.json 的夹具:
[
{
"model": "sites.site",
"pk": 1,
"fields": {
"domain": "myproject.mydomain.com",
"name": "My Project"
}
}
]
一个小提示:因为这是整个项目的通用数据,所以最好将夹具存储到 /myproject/fixtures/ 或应用程序 /myproject/commons/ (就像我一样)而不是只存储一些应用程序。这使数据易于查找,并使应用程序更具可重用性。
第二个注意事项:Django 允许在多个应用程序中使用多个 initial_data.json 固定装置(尽管使用混合的 initial_data.json 和 initial_data.yaml 固定装置集并没有按预期工作:P)。它们都将在运行 syncdb 时自动用于预填充数据库。
一些参考资料:
如果您想自动执行此操作,请尝试此操作
from django.contrib import sites
from django.db.models import signals
from django.conf import settings
def create_site(app, created_models, verbosity, **kwargs):
"""
Create the default site when when we install the sites framework
"""
if sites.models.Site in created_models:
sites.models.Site.objects.all().delete()
site = sites.models.Site()
site.pk = getattr(settings, 'SITE_ID', 1)
site.name = getattr(settings, 'SITE_NAME', 'Example')
site.domain = getattr(settings, 'SITE_DOMAIN', 'example.com')
site.save()
signals.post_syncdb.connect(create_site, sender=sites.models)
每当执行管理命令时,都需要运行该代码。因此,您可以将其management/__init__.py
用于任何应用程序。然后只需将SITE_ID
,SITE_NAME
和SITE_DOMAIN
加到您的settings.py
.
您可以从 shell 使用管理界面,也可以编写脚本(如果您正在寻找自动化解决方案)。以下是从 shell 执行此操作的方法(以及您将在脚本中放入的内容):
[sledge@localhost projects]$ python manage.py shell
>>> from django.contrib.sites.models import Site
>>> newsite = Site(name="Test",domain="test.com")
>>> newsite.save()