继承django.contrib.auth.models会导致不散列密码

时间:2012-08-24 02:22:29

标签: python django

所以我正在学习如何使用Django,我目前正在尝试将我的Person类与位于包django.contrib.auth.models中的Django的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表和person表。

如果我查询auth_user表,我发现我的密码从未被哈希过。看看Django源代码,这表明create_user从未被调用过。有人可以向我解释这是如何工作的吗?

另外,如果有人可以解释我如何使用人物实例查询auth_user信息,那也很好。它们之间没有明确的外键,但是继承必须考虑到某些东西。

1 个答案:

答案 0 :(得分:0)

如果您要自定义Django auth_user模块

你应该创建像

这样的模型

class Person(models.Model):

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

不要忘记从auth.models

导入用户

在你的观点中

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 docs所说create_user本身会在你的auth_user表中为你输入密码字段

您还需要更改您的signUp表单

希望这会对你有所帮助

浏览http://www.hackedexistence.com/project-django.html此链接