如何解决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
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"
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。