无法创建超级用户 Django

Posted

技术标签:

【中文标题】无法创建超级用户 Django【英文标题】:Can't Create Super User Django 【发布时间】:2012-12-13 03:10:30 【问题描述】:

我假设这是因为我的超级用户依赖于尚无现有数据的 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 不应该应用于超级用户吗?我应该如何防止这种情况?

【问题讨论】:

您是否已将 UserProfile 应用添加到您的设置中?如果不是,则不会使用 syncdb 创建表。您的代码看起来不错(至少乍一看——我已经实现了一个非常相似的保存后方法,没有任何问题)。 另外,为了清楚起见,您的陈述“我假设这是因为我的超级用户依赖于 UserProfile”是不正确的——这里的依赖关系正好相反。事实上,如果您的 createsuperuser 命令完全失败,我会感到惊讶——我敢打赌它创建了超级用户,只是未能创建关联的配置文件。 另外,您是否知道在 Django 1.5 中,开发人员允许自定义 Django User 模型?如果您改为扩展 User 模型,则不必创建单独的 UserProfile(不知道您是否真的打算将它们分开,只是一个想法) 感谢您纠正我的错误陈述。我目前正在使用 1.4,但我知道添加的自定义。 :) 那么是否您将 UserProfile 添加到您的设置中? 【参考方案1】:

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

进一步调查:看起来这是 South/syncdb 交互。这 UserProfile 将由南迁移创建,但当然 当 auth post_install 运行提示输入超级用户时,尚未运行。

遗憾的是 syncdb --migrate 也没有做正确的事情。

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

不要在 syncdb 期间创建超级用户,您的用户配置文件表将不存在。 您必须在管理员上有一个创建信号来创建用户配置文件,这看起来 好像失败了

你想用来初始化数据库的过程是:

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

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

【讨论】:

为了将来参考,如果你运行syncdb --all,即使是通常通过南创建的东西,它也应该创建表。此外,如果您使用 south 管理一些事情,而使用 syncdb 管理一些事情,那么在您最初的问题中提及这将是一件很有帮助的事情:)【参考方案2】:

我刚刚遇到了同样的问题 - 通过迁移创建的配置文件模型,以及在使用初始 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)

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

【讨论】:

以上是关于无法创建超级用户 Django的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Django 1.5 中使用自定义用户模型创建超级用户

无法使用 Eclipse IDE 在 Python-Django 上创建超级用户帐户?

Django 中的异常错误。创建超级用户后无法登录管理员

Django:创建电子邮件登录字段而不是用户名后,超级用户和用户无法登录到管理员和用户页面

由于不在 TTY 中工作,无法在 django 中创建超级用户

Django 中的项目:我无法在终端中创建超级用户来操作 Postgresql 中的数据