数据库错误:没有这样的表:auth_user。扩展 AbstractUser 并使用模型在管理员上注册
Posted
技术标签:
【中文标题】数据库错误:没有这样的表:auth_user。扩展 AbstractUser 并使用模型在管理员上注册【英文标题】:Database error: no such table: auth_user. Extending AbstractUser and using model to register on admin 【发布时间】:2013-06-22 18:12:28 【问题描述】:我正在尝试使用 AbstractUser 向 Django 的标准用户模型添加一个字段。这是我的代码:
class GUser(AbstractUser):
uuid = UUIDField(auto=True)
这已经成功了,因为我可以从 shell 中说,
>>> a = GUser.objects.all()
>>> a
[<GUser: User1>]
>>> a[0].uuid
UUID('7d1f0b7b52144a2ea20db81ce74741e3')
我遇到的问题是从 /admin 注册一个新用户。当我创建一个新用户时,我得到一个数据库错误:
no such table: auth_user
在我深入了解之前,这是我的 forms.py:
class GUserChangeForm(UserChangeForm):
class Meta:
model = get_user_model()
class GUserCreationForm(UserCreationForm):
class Meta:
model = get_user_model()
def clean_username(self):
username = self.cleaned_data["username"]
try:
get_user_model().objects.get(username=username)
except get_user_model().DoesNotExist:
return username
raise forms.ValidationError(self.error_messages['duplicate'])
还有我的 admin.py:
class GUserAdmin(UserAdmin):
form = GUserChangeForm
add_form = GUserCreationForm
fieldsets = (
(None, 'fields': [('username', 'password')]),
('Personal info', 'fields': ('is_active','is_staff','is_superuser','groups', 'user_permissions')),
('Important dates', 'fields': ('last_login', 'date_joined')),
#('Universal ID', 'fields': ('uuid'))
)
admin.site.register(GUser,GUserAdmin)
我读到,当其他人发生这种情况时,他们实现了自己的表单(就像我一样)来覆盖 clean_username(self):
但是,当我尝试从管理员添加用户时,我认为这不会被调用。即使我注册了 GUserAdmin,也会调用 auth.forms.py 文件。
另外,当我删除我的数据库 (sqlite3) 然后调用 python manage.py syncdb 时,我发现实际上没有创建 auth_user 表。
是的,我在 settings.py 中包含了 AUTH_USER_MODEL。
任何帮助将不胜感激。
我已阅读: https://docs.djangoproject.com/en/1.5/topics/auth/customizing/#custom-users-and-the-built-in-auth-forms
还有大量的 SO 帖子,但似乎没有一个可以解决我遇到的问题。
【问题讨论】:
看起来这个帖子有你的答案:groups.google.com/forum/#!topic/django-users/kOVEy9zYn5c 显然,自定义模型不尊重经理的Meta
@karthikr 我看过那个页面,但不确定我们是否遇到了同样的问题。真正改变auth.forms.py中的代码的解决方案是什么?
我认为这是 Scott Anderson 3 月 20 日的回答
谢谢!我想这就是我想要的。
好吧,如果是这样,请确认,以便我可以将此标记为答案,以便对未来的开发人员有所帮助
【参考方案1】:
也许错误在于数据库的不正确归零。 '数据库错误:没有这样的表:str'
要删除数据库,只需删除迁移包中的数据库和所有迁移(如 0001_initial.py 等)。
不要删除所有迁移包和文件“init.py”。如果您这样做,请创建它们。 Django 不会再次创建它们。 之后,不要记得运行 makemigrations & migrate。
【讨论】:
【参考方案2】:因此删除了我在此方面所做的所有工作,并继续使用标准用户,以便我能够取得进展。然后有一天我回到它并设法在一小时内让它工作。 我将发布代码以供参考,但我无法确定造成差异的原因。我知道创作形式和东西不是必需的。
models.py
class PropaUser(AbstractUser):
uuid = UUIDField(auto=True)
admin.py
from django.contrib import admin
from login.models import PropaUser
admin.site.register(PropaUser)
settings.py
AUTH_USER_MODEL = "login.PropaUser"
其他模型.py
class Word(models.Model):
user = models.ManyToManyField(settings.AUTH_USER_MODEL)
deck = models.ManyToManyField(Deck)
word = models.CharField(max_length=100)
def __unicode__(self): # Python 3: def __str__(self):
return self.word
这是有效的。我不知道是什么导致了之前的所有问题,因为我想我在发布这个问题之前尝试了这种方法。这可能不是一个令人满意的答案,但这是有效的。早些时候,我还对将字段添加到现有用户所需的内容感到困惑。就是这个。
【讨论】:
我现在也有同样的问题。当一个人没有注册从“UserAdmin”继承的东西时,它就可以工作。admin.site.register(GUser,GUserAdmin)
与 admin.site.register(PropaUser)
当我用 Django 1.6 尝试这个时,我最终能够直接直接编辑所有字段(包括内置密码字段的哈希结果)!以上是关于数据库错误:没有这样的表:auth_user。扩展 AbstractUser 并使用模型在管理员上注册的主要内容,如果未能解决你的问题,请参考以下文章
在 SQLite Android 中发现“没有这样的表”错误
Netbeans 连接到 SQLite 时出现 SQLite 错误或缺少数据库(没有这样的表)
如何解决android.database.sqlite.SQLiteException:没有这样的表错误?