我想在最初运行syncdb后填充django_site表 我怎样才能做到这一点 我只有一个网站
答案 0 :(得分:35)
简单的解决方案是为站点应用创建一个initial_data.json fixture,它将覆盖默认值。
例如,我在/myproject/myapp/fixtures/initial_data.json的灯具:
[
{
"model": "sites.site",
"pk": 1,
"fields": {
"domain": "myproject.mydomain.com",
"name": "My Project"
}
}
]
注意:因为这是整个项目的常用数据,所以将夹具存储到/ myproject / fixtures /或app / myproject / commons /(就像我这样做)而不是存储它可能是个好主意。使用只是一些应用。这样可以使数据易于查找,并使应用程序更具可重用性。
第二个注意事项:Django允许在多个应用程序中使用多个initial_data.json装置(使用混合的initial_data.json和initial_data.yaml装置集合虽然没有按预期工作:P)。当syncdb运行时,它们都将自动用于预先填充数据库。
一些参考文献:
答案 1 :(得分:5)
如果您想自动执行此操作,请尝试此操作
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
。
答案 2 :(得分:4)
您可以使用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()