1

だから私はDjangoの使い方を学んでおり、現在、自分のクラスをパッケージdjango.contrib.auth.modelsにあるPersonDjangoのクラスと統合しようとしています。User次のようにクラスを継承します。

class Person(User):

    MALE = 'M'
    FEMALE = 'F'

    GENDER = (
        (MALE, 'Male'),
        (FEMALE, 'Female'),
    )

    birth_date = models.DateField()

    gender = models.CharField(max_length = 1, choices = GENDER)

私のフォームは次のように定義されます。

class SignupForm(ModelForm):
    MALE = 'M'
    FEMALE = 'F'

    GENDER = (
        (MALE, 'Male'),
        (FEMALE, 'Female'),
    )

    thisYear = date.today().year

    YEARS = [thisYear - year for year in range(100)]

    password = forms.CharField(widget = forms.PasswordInput(), min_length=5, max_length = 128)

    birth_date = forms.DateField(widget=extras.SelectDateWidget(years = YEARS), initial='1990-01-01')

    gender = forms.ChoiceField(choices = GENDER, initial='M')

    class Meta:
        model = Person
        exclude = ('last_name', 'is_staff', 'is_active', 'is_superuser', 'last_login', 'date_joined', 'user_permissions', 'groups', 'attraction' )

        #all fields in this list will map to a specific model attribute and will be comitted to the database
        fields = ('username', 'password', 'first_name', 'email', 'gender', 'birth_date')

いくつかのことを除外しましたが、要点はわかります。私の見解では、新しい を作成するときはPersonを呼び出します newPerson = signupForm.save(commit=False)

newPerson にいくつかの値を追加した後、 を呼び出しますnewPerson.save()

auth_userこのアクションは、テーブルとテーブルの 2 つの異なるテーブルに新しい行を作成しpersonます。

テーブルにクエリを実行するauth_userと、パスワードがハッシュされていないことがわかります。create_userDjango ソースを見ると、これは呼び出されたことがないことを示唆しています。誰かがこれがどのように機能するかを説明できますか?

auth_userまた、個人インスタンスを使用して情報を照会する方法を誰かが説明できれば、それも素晴らしいことです。それらの間に明示的な外部キーはありませんが、その継承は何かを説明する必要があります。

4

1 に答える 1

0

Django auth_user モジュールをカスタマイズしている場合

次のようにモデルを作成する必要があります

クラス Person(models.Model):

user = models.OneToOneField(User) 
blah = 
.
.

auth.models から User をインポートすることを忘れないでください

あなたの見解では

if form.is_valid():
    user = User.objects.create_user(username = form.cleaned_data['username'],
                                    email = form.cleaned_data['email'],
                                    password = form.cleaned_data['password'],
                                    )

django docscreate_userが言ったように、auth_userテーブルのパスワードフィールド自体がハッシュされます

サインアップフォームも変更する必要があります

これがあなたを助けることを願っています

http://www.hackedexistence.com/project-django.html このリンクにアクセスしてください

于 2012-08-24T06:06:39.983 に答える