无法创建超级用户Django

时间:2012-12-27 18:41:28

标签: django

我假设这是因为我的超级用户依赖于UserProfile,而UserProfile还没有现有数据。 我的模型看起来像

from django.db import models
from django.contrib.auth.models import User
from django.db.models.signals import post_save

class UserProfile(models.Model):
    user = models.OneToOneField(User) # required
    location = models.CharField(max_length=100)
    age = models.PositiveIntegerField(blank=True,null=True)
    contribution_points = models.PositiveIntegerField()
    #acheivements = models.ManyToMany()

def create_user_profile(sender,instance,created,**kwargs):
    if created:
        UserProfile.objects.create(user=instance)

post_save.connect(create_user_profile, sender=User)

但是,我最终得到以下错误:

django.db.utils.DatabaseError: (1146, "Table 'savory_db.login_userprofile' doesn't exist")

尽管刚刚跑了syncdb

我的模型是否有任何可能导致此错误的矛盾字段。 UserProfile应该不适用于超级用户吗?我该如何防止这种情况?

2 个答案:

答案 0 :(得分:27)

2011年3月23日凌晨4点25分,Malcolm Box写道:

  

进一步调查:看起来它是南/ syncdb交互。该   UserProfile将由南迁移创建,但当然也是如此   当auth post_install运行以提示超级用户时,它没有运行。

     

可悲的是syncdb --migrate也没做正确的事。

     

目前,我只是使用./manage.py手动创建超级用户   shell,但欢迎任何关于如何更好地解决这个问题的想法。

在syncdb期间不要创建超级用户,您的用户配置文件表将不存在。 您必须在admin上创建一个创建用户配置文件的创建信号 喜欢失败

您要用来初始化数据库的过程是:

python manage.py syncdb --noinput
python manage.py migrate
python manage.py createsuperuser

参考:https://groups.google.com/forum/?fromgroups=#!topic/django-users/sBXllxrIdMc

答案 1 :(得分:0)

我刚刚遇到了同样的问题 - 通过迁移创建的配置文件模型,以及使用初始syncdb创建超级用户时中断的信号处理程序。

我的解决方案如下。

首先,处理表尚不存在的情况。这有点难看,也许太激烈了(可能会掩盖其他错误)

@receiver(post_save, sender=User)
def create_profile(sender, instance, created, **kwargs):
    try:
        WheelProfile.objects.get_or_create(user=instance)
    except DatabaseError:
        logging.error("Failed to create profile for %s, perhaps migrations haven't run yet?" % instance)
        from django.db import connection
        connection._rollback()

其次,在迁移完成后运行处理程序:

from south.signals import post_migrate

@receiver(post_migrate)
def create_profiles(app, **kwargs):
    if app == "wheelcms_axle":
        for u in User.objects.all():
            WheelProfile.objects.get_or_create(user=u)

当然,这也将在进行未来迁移时运行,为没有迁移的用户创建配置文件。对我来说,这不是问题。