11

当我最初在syncdb之后运行时,我想填充django_site表我该怎么做我只有一个站点

4

3 回答 3

36

简单的解决方案是为站点应用程序创建一个 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 时自动用于预填充数据库。

一些参考资料:

于 2012-02-02T18:55:07.507 回答
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_NAMESITE_DOMAIN加到您的settings.py.

于 2011-12-20T16:31:43.760 回答
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()
于 2010-10-14T16:38:57.737 回答