Django 超级用户无法更改用户权限 - 将用户类型更改为人员

问题描述

我正在使用 python 3.6 和 Django V 2.2 创建一个 Django 项目。现在在 Django 管理面板(超级用户)中无法将用户类型转换为人员。它也无法编辑某些用户字段。我已经在我的本地主机和 Postgresql DB(PG 管理员)Apache2 服务器上尝试过 DB.sqlite。 请为我的问题提供任何解决方案。我已经在下面描述了所有相关代码。 还可以找到我的问题的附件。 Django Admin 显示成功消息。但行动无果 (https://i.ibb.co/tDstxff/django-adminerror.png)Error after change user to staff

我的项目文件是:models.py

#ProApp/Models
from django.db import models
from django.contrib.auth.models import AbstractUser
from django.contrib.auth.models import AbstractBaseUser,BaseUserManager
from django.conf import settings
from django.db.models import Sum
from django.db.models.signals import pre_save,post_save
from django.dispatch import receiver
from datetime import date
import datetime

User = settings.AUTH_USER_MODEL


#Create your models here

class CustomUserManager(BaseUserManager):

    def _create_user(self,username,email,password=None,**extra_fields):
        """Create and save a User with the given email and password."""
        if not email:
            raise ValueError('The given email must be set')
        email = self.normalize_email(email)
        user = self.model(email=email,username=username,**extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_user(self,password):
        if not username:
            raise ValueError('missing email')
        user = self.model(username=username)
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self,**extra_fields):
        """Create and save a SuperUser with the given email and password."""
        extra_fields.setdefault('is_staff',True)
        extra_fields.setdefault('is_superuser',True)

        if extra_fields.get('is_staff') is not True:
            raise ValueError('Superuser must have is_staff=True.')
        if extra_fields.get('is_superuser') is not True:
            raise ValueError('Superuser must have is_superuser=True.')

        return self._create_user(username,password,**extra_fields)


    class CustomUser(AbstractUser):
    sponsorId = models.CharField(max_length=256,null=True,blank=True)
    mobile = models.CharField(max_length=15,blank=True)
    userId = models.CharField(max_length=100,blank=True)
    email = models.EmailField(null=True,blank=True,unique=True)
    address = models.CharField(max_length=256,blank=True)
    zipCode = models.CharField(max_length=200,blank=True)
    country = models.CharField(max_length=100,blank=True)
    bank_ac_no = models.CharField(max_length=256,blank=True)
    bank_ifsc = models.CharField(max_length=256,blank=True)
    bank_proof = models.FileField(upload_to='bank_proofs',blank=True)
    idproof_no = models.CharField(max_length=100,blank=True)
    id_proof = models.FileField(upload_to='id_proof',blank=True)
    status = models.BooleanField(default=False)
    kyc = models.BooleanField(default=False)
    date = models.DateTimeField(auto_Now_add=True)
    pw = models.CharField(max_length=200,verbose_name='Generated Password')
    usertype = models.IntegerField(default=2)
    userLevel = models.IntegerField(default=0)
    total_inv_profit = models.FloatField(default=0.00)
    total_ref_profit = models.FloatField(default=0.00)
    total_wdr_profit = models.FloatField(default=0.00)
    total_avbl_profit = models.FloatField(default=0.00)
    total_withdrawals = models.FloatField(default=0.00)
    withdrawed_investments = models.FloatField(default=0.00) # May be Not Usefull
    available_investments = models.FloatField(default=0.00) # For withdraw - Unlockdate compleeted of Total Active
    active_investments = models.FloatField(default=0.00) # Total Active inv
    user_doc = models.FileField(upload_to='User_Docs',blank=True)
    created_on = models.DateTimeField(auto_Now_add=True)
    created_by = models.ForeignKey(User,related_name='user_generated',on_delete=models.DO_nothing,null=True)
    updated_on = models.DateTimeField(auto_Now=True)
    updated_by = models.ForeignKey(User,related_name='user_modified',null=True)

    objects = CustomUserManager()

    USERNAME_FIELD = 'username'

    def get_short_name(self):
        return self.username

    def get_full_name(self):
        return self.first_name

    class Meta:
        db_table = "Custom User

  **#In the Signals**

     @receiver(pre_save,sender=CustomUser)
    def fix_username(sender,instance,**kwargs):
        if instance.userId is not None:
            instance.username = instance.userId
            instance.usertype = 2
            instance.is_staff = False
        else:
            instance.userId = instance.username
            instance.name = instance.username
            instance.usertype = 1
            instance.is_staff = True

用户应用中的 Admin.py 文件

from django.conf import settings
User = settings.AUTH_USER_MODEL
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from proApp.models import CustomUser,Tree,Transaction,DefaultValues,ContactUS,AdminProfit,ErrorLog

# Register your models here.

class UsersAdmin(BaseUserAdmin):
    fieldsets = BaseUserAdmin.fieldsets + (
        (None,{'fields': ('mobile','sponsorId','address','zipCode','country','bank_ac_no','bank_ifsc','bank_proof','idproof_no','id_proof','user_doc','status','usertype','total_inv_profit','total_ref_profit','total_wdr_profit','total_avbl_profit','total_withdrawals'
            )}),)
    admin.site.site_header = 'Django- administration'



admin.site.register(CustomUser,UsersAdmin)
admin.site.register(Tree)
admin.site.register(Transaction)
admin.site.register(DefaultValues)
admin.site.register(ContactUS)
admin.site.register(AdminProfit)
admin.site.register(ErrorLog)

我还粘贴了 Users/Views.py 用于注册视图

# customer registration page
class SignUp(SuccessMessageMixin,generic.CreateView):
    model = CustomUser
    form_class = CustomUserCreationForm
    template_name = "proApp/signup.html"
    success_url = reverse_lazy('proApp:login')
    success_message = "Successfully registered"

    def form_valid(self,request,form):
        form.instance.usertype = "2"
        result = super().form_valid(form)
        return result

最后这是我在 Users/forms.py

中的用户更改表单
class CustomUserChangeForm(UserChangeForm):
    class Meta:
        model = get_user_model()
        fields = (
            'first_name','last_name','email','mobile','user_doc')
        widgets = {
            'first_name': forms.TextInput(attrs={'class': 'form-control','placeholder': 'First Name','required': 'required'}),'last_name': forms.TextInput(attrs={'class': 'form-control','placeholder': 'Last Name','mobile': forms.TextInput(attrs={'class': 'form-control','placeholder': 'Mobile','email': forms.TextInput(attrs={'class': 'form-control','placeholder': 'Email','address': forms.TextInput(attrs={'class': 'form-control','placeholder': 'Address'}),'zipCode': forms.TextInput(attrs={'class': 'form-control','placeholder': 'Zip Code'}),'country': forms.TextInput(attrs={'class': 'form-control','placeholder': 'Country'}),'bank_ac_no': forms.TextInput(attrs={'class': 'form-control','placeholder': 'Account Number','bank_ifsc': forms.TextInput(attrs={'class': 'form-control','placeholder': 'IFSC','bank_proof': forms.FileInput(attrs={'class': 'form-control-file','idproof_no': forms.TextInput(attrs={'class': 'form-control','placeholder': 'ID Proof Number','id_proof': forms.FileInput(attrs={'class': 'form-control-file',}),'user_doc': forms.FileInput(attrs={'class': 'form-control-file',}

解决方法

试试这个:

您可以覆盖 pre_save 模型的 save() 方法,而不是通过 CustomUser 信号更改值。

class CustomUser(AbstractUser):
    sponsorId = models.CharField(max_length=256,null=True,blank=True)
    mobile = models.CharField(max_length=15,blank=True)
    .......

    def save(self,*args,**kwargs):
        if self.userId is not None:
            self.username = self.userId
            self.usertype = 2
            self.is_staff = False
        else:
            self.userId = self.username
            self.name = self.username
            self.usertype = 1
            self.is_staff = True
        super(CustomUser,self).save(*args,**kwargs)

    class meta:
        db_table = "Custom User"