8

AbstractUser を使用して、Django の標準 User モデルにフィールドを追加しようとしています。これは私のコードです:

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

そのため、これで行ったすべての作業を削除し、標準ユーザーで作業を進めて、進歩できるようにしました。それからある日、私はそれに戻って、1時間でそれを機能させることができました. 参照用にコードを投稿しますが、違いの原因を特定することはできません。作成フォームなどは必要ないことはわかっています。

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)

設定.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

これが機能しているものです。この質問を投稿する前にこの方法を試したと思うので、以前にすべての問題を引き起こした原因はわかりません。これは満足のいく答えではないかもしれませんが、これが機能しているものです。以前、既存の User にフィールドを追加するだけで何が必要かについても混乱しました。これです。

于 2013-07-28T22:28:09.620 に答える