• 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'

  • 相关阅读:
    蓝桥杯训练 2n皇后问题
    AtCoder Grand Contest #026 B
    AtCoder Grand Contest #026 A
    AtCoder Beginner Contest 103
    7-26 单词长度(15 分)
    uva 10006 Carmichael Numbers
    java并发带返回结果的批量任务执行(CompletionService:Executor + BlockingQueue)
    并发容器之CopyOnWriteArrayList
    模板模式
    静态工具类中使用注解注入service
  • 原文地址:https://www.cnblogs.com/retacn-yue/p/6194183.html
Copyright © 2020-2023  润新知