8

我正在尝试使用 AbstractUser 向 Django 的标准用户模型添加一个字段。这是我的代码:

class GUser(AbstractUser):
    uuid = UUIDField(auto=True)

这是成功的,因为从外壳我可以说,

>>> 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 帖子,但似乎没有一个可以解决我遇到的问题。

4

2 回答 2

1

也许错误在于数据库的不正确归零。'数据库错误:没有这样的表:str'

要删除数据库,只需删除迁移包中的数据库和所有迁移(如 0001_initial.py 等)。

不要删除所有迁移包和文件“ init .py”。如果您这样做了,请创建它们。Django 不会再次创建它们。之后,不要记得运行 makemigrations & migrate。

于 2018-07-17T08:37:42.400 回答
0

所以删除了我所做的所有工作并继续使用标准用户,以便我可以取得进展。然后有一天我回到它并设法在一小时内让它工作。我将发布代码以供参考,但我无法确定造成差异的原因。我知道创作形式和东西不是必需的。

模型.py

class PropaUser(AbstractUser):
    uuid = UUIDField(auto=True)

管理员.py

from django.contrib import admin
from login.models import PropaUser

admin.site.register(PropaUser)

设置.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

这就是工作。我不知道是什么导致了之前的所有问题,因为我想我在发布这个问题之前尝试过这种方法。这可能不是一个令人满意的答案,但这是有效的。早些时候,我还对将字段添加到现有用户所需的内容感到困惑。就是这个。

于 2013-07-28T22:28:09.620 回答