运行Django的./manage.py syncdb时自动提示更新默认站点域名?

时间:2010-02-23 21:14:17

标签: python django django-sites

关于Django Sites模块和manage.py syncdb

在。\ manage.py syncdb期间,Auth模块可以提示要求管理站点的默认超级用户。我想看到默认站点域名发生类似的事情。目前它是example.com,硬编码除非我使用管理员网站进行更改。我想在syncdb期间更改它。

2 个答案:

答案 0 :(得分:6)

我制作了一个可以插入和播放的小型django应用程序。插上电源:

  1. 将其下载到项目目录或项目可以找到的位置。
  2. 在您的settings.py INSTALLED_APPS,“site_default”(应用名称)中添加,或者在它依赖的“django.contrib.sites”之后添加。
  3. 运行manage.py syncdbmanage.py createdefaultsite
  4. 屏幕截图:

    (pinax-dev)>manage.py createdefaultsite
    Site domain name: mydomain.com
    Site display name: My Site!
    (pinax-dev)
    

    它带有单元测试。 要运行单元测试:

    (pinax-dev)>manage.py test site_default
    

    “site_default”是应用名称。

    源代码: http://github.com/peiwei/pinax/raw/master/pinax/apps/site_default.tgz

    更多截图:

    (pinax-dev)> manage.py syncdb
    Creating table...
    You just installed Django's auth system, which means you don't have any superuse
    rs defined.
    Would you like to create one now? (yes/no): yes
    Username: administrator
    E-mail address: who@who.com
    Password:
    Password (again):
    Superuser created successfully.
    
    Would you like to change the default site domain name? (yes/no)[default:no]: yes
    
    Site domain name: mydomain.com
    Site display name: My Site!
    ...
    Installing index for signup_codes.SignupCode model
    Installing index for signup_codes.SignupCodeResult model
    

答案 1 :(得分:4)

你可以自己做:

  1. 创建管理命令以提示您的新网站
  2. 将其连接到post_syncdb信号
  3. 该命令可让您从命令行方便地设置站点。将其连接到信号意味着每当安装sites应用程序时都会提示您。例如:

    from django.contrib.sites import models as sites_app
    signals.post_syncdb.connect(create_site, sender=sites_app)
    

    在编写create_site函数(信号处理程序)时,您几乎可以完全复制auth模块的方法:

    def create_site(app, created_models, verbosity, **kwargs):
    from django.contrib.sites.models import Site
    from django.core.management import call_command
    if Site in created_models and kwargs.get('interactive', True):
        msg = "\nYou just installed Django's sites system, which means you don't have " \
                "any sites defined.\nWould you like to create one now? (yes/no): "
        confirm = raw_input(msg)
        while 1:
            if confirm not in ('yes', 'no'):
                confirm = raw_input('Please enter either "yes" or "no": ')
                continue
            if confirm == 'yes':
                call_command("createsite", interactive=True)
            break
    

    现在您只需创建管理命令createsite即可。我确实想知道为什么这不是已经在Django中了,我讨厌example.com。

    将所有这些放入一个小应用程序中,并为每个项目重复使用它。如果你在谷歌代码或django的bug追踪器之类的地方发布应用程序,奖励积分。