django 扩展user字段

方式一:用自定义的user对象替换django中的默认

model.py中自定义user对象
'''
自定义用户管理
'''
class
MyUserManager(BaseUserManager):

    def create_user(self, email, date_of_birth, device_id,password=None):
        """
        Creates and saves a User with the given email, date of
        birth and password.
        """
        
if not email:
            raise ValueError('Users must have an email address')
        user = self.model(
            email=self.normalize_email(email),
            date_of_birth=date_of_birth,
            device_id=device_id,
        )
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, email, date_of_birth, password,device_id):
        """
        Creates and saves a superuser with the given email, date of
        birth and password.
        """

        
user = self.create_user(
            email,
            password=password,
            date_of_birth=date_of_birth,
            device_id=device_id,
        )
        user.is_admin = True
        
user.save(using=self._db)
        return user

"""
自定义用户
"""
class
MyUser(AbstractBaseUser):
    email = models.EmailField(
        verbose_name='email address',
        max_length=255,
        unique=True,
    )

    date_of_birth = models.DateField()
    #设备编号
    
device_id=models.CharField(max_length=10)
    is_active = models.BooleanField(default=True)
    is_admin = models.BooleanField(default=False)

    objects = MyUserManager()
    USERNAME_FIELD = 'email'
    
REQUIRED_FIELDS = ['date_of_birth','device_id']

    def get_full_name(self):
        # The user is identified by their email address
        
return self.email

    def get_short_name(self):
        # The user is identified by their email address
        
return self.email

    def __str__(self):  # __unicode__ on Python 2
        
return self.email

    def has_perm(self, perm, obj=None):
        "Does the user have a specific permission?"

        # Simplest possible answer: Yes, always
        
return True

    def
has_module_perms(self, app_label):
        "Does the user have permissions to view the app `app_label`?"

        # Simplest possible answer: Yes, always
        
return True

    
@property
    def is_staff(self):
        "Is the user a member of staff?"

        # Simplest possible answer: All admins are staff
        
return self.is_admin

 

 

admin.py,修改表单样式


"""
自定义用户
"""
class
UserCreationForm(forms.ModelForm):
    """A form for creating new users. Includes all the required
    fields, plus a repeated password."""
    
password1 = forms.CharField(label='Password', widget=forms.PasswordInput)
    password2 = forms.CharField(label='Password confirmation', widget=forms.PasswordInput)

    class Meta:
        model = MyUser
        fields = ('email', 'date_of_birth','device_id')

    def clean_password2(self):

        # Check that the two password entries match
        
password1 = self.cleaned_data.get("password1")
        password2 = self.cleaned_data.get("password2")
        if password1 and password2 and password1 != password2:
            raise forms.ValidationError("Passwords don't match")
        return password2

    def save(self, commit=True):
        # Save the provided password in hashed format
        
user = super(UserCreationForm, self).save(commit=False)
        user.set_password(self.cleaned_data["password1"])
        if commit:
            user.save()
        return user


class UserChangeForm(forms.ModelForm):
    """A form for updating users. Includes all the fields on
    the user, but replaces the password field with admin's
    password hash display field.
    """
    
password = ReadOnlyPasswordHashField()

    class Meta:
        model = MyUser
        fields = ('email', 'date_of_birth', 'is_active', 'is_admin')

    def clean_password(self):
        # Regardless of what the user provides, return the initial value.
        # This is done here, rather than on the field, because the
        # field does not have access to the initial value
        
return self.initial["password"]


class UserAdmin(BaseUserAdmin):
    # The forms to add and change user instances
    
form = UserChangeForm
    add_form = UserCreationForm
    # The fields to be used in displaying the User model.
    # These override the definitions on the base UserAdmin
    # that reference specific fields on auth.User.
    
list_display = ('email', 'date_of_birth', 'is_admin','device_id')
    list_filter = ('is_admin',)
    fieldsets = (
        (None, {'fields': ('email', 'password')}),
        ('Personal info', {'fields': ('date_of_birth','device_id',)}),
        ('Permissions', {'fields': ('is_admin',)}),
    )
    # add_fieldsets is not a standard ModelAdmin attribute. UserAdmin
    # overrides get_fieldsets to use this attribute when creating a user.
    
add_fieldsets = (
        (None, {
            'classes': ('wide',),
            'fields': ('email', 'date_of_birth', 'password1', 'password2','device_id')}
         ),
    )
    search_fields = ('email',)
    ordering = ('email',)
    filter_horizontal = ()


# Now register the new UserAdmin...
admin.site.register(MyUser, UserAdmin)
# ... and, since we're not using Django's built-in permissions,
# unregister the Group model from admin.
#admin.site.unregister(Group)

 

 

settings.py中定义


#使用自定义用户
#AUTH_USER_MODEL = 'jkx.MyUser'

 

 

方式二:新建一个新的模型,user作为外键导入

Model.py添加


#扩展user模型
class UserProfile(models.Model):
    user = models.OneToOneField(User)
    description = models.TextField(max_length=51200)
    scope = models.IntegerField(default=100)


def create_user_profile(sender, instance, created, **kwargs):
    if created:
        profile, created = UserProfile.objects.get_or_create(user=instance)


post_save.connect(create_user_profile, sender=User)

 

 

Views.py添加
#扩展user测试
def userDemo(request):
    desc = User.objects.all()[0].get_profile().description
    return HttpResponse(desc)

 

Utls.py中添加

#扩展user
url(r'^profile/',views.userDemo),

 

 


# 扩展user
class UserProfileAdmin(admin.ModelAdmin):
    fields = ('user', 'description',)


admin.site.register(UserProfile, UserProfileAdmin)

 

修改settings.py

#扩展user
AUTH_PROFILE_MODULE='jkx.UserProfile'

posted @ 2016-10-25 14:38  retacn_yue  阅读(300)  评论(0编辑  收藏  举报