![](/img/trans.png)
[英]Django: How to programatically change superuser and/or staff status of a user
[英]Django Superuser cant change user permission - change user type to staff
我正在使用 python 3.6 和 Django V 2.2 创建一个 Django 项目。 现在在 Django 管理面板(超级用户)中无法将用户类型转换为人员。 它也不能编辑一些用户字段。 我已经在我的本地主机和 PostgreSQL DB(PG 管理员在)Apache2 服务器上尝试了 DB.Sqlite。 请为我的问题提供任何解决方案。 我已经在下面描述了所有相关代码。 还找到我的问题的附件。 Django 管理员显示成功消息。 但是操作没有结果( https://i.ibb.co/tDstxff/django-adminerror.png )将用户更改为员工后出错
我的项目文件是: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, username, 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, username, email, password=None, **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, email, password, **extra_fields)
class CustomUser(AbstractUser):
sponsorId = models.CharField(max_length=256, null=True, blank=True)
mobile = models.CharField(max_length=15, null=True, blank=True)
userId = models.CharField(max_length=100, null=True, blank=True)
email = models.EmailField(null=True, blank=True, unique=True)
address = models.CharField(max_length=256, null=True, blank=True)
zipCode = models.CharField(max_length=200, null=True, blank=True)
country = models.CharField(max_length=100, null=True, blank=True)
bank_ac_no = models.CharField(max_length=256, null=True, blank=True)
bank_ifsc = models.CharField(max_length=256, null=True, blank=True)
bank_proof = models.FileField(upload_to='bank_proofs', null=True, blank=True)
idproof_no = models.CharField(max_length=100, null=True, blank=True)
id_proof = models.FileField(upload_to='id_proof', null=True, 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, null=True, blank=True, 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', null=True, blank=True)
created_on = models.DateTimeField(auto_now_add=True)
created_by = models.ForeignKey(User, related_name='user_generated', blank=True, on_delete=models.DO_NOTHING,
null=True)
updated_on = models.DateTimeField(auto_now=True)
updated_by = models.ForeignKey(User, related_name='user_modified', blank=True, on_delete=models.DO_NOTHING,
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)
我还为 Registrationview 粘贴了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', 'zipCode', 'address', 'country', 'bank_ac_no', 'bank_ifsc',
'idproof_no', 'id_proof', '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', 'required': 'required'}),
'mobile': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Mobile', 'required': 'required'}),
'email': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Email', 'required': 'required'}),
'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', 'required': 'required'}),
'bank_ifsc': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'IFSC', 'required': 'required'}),
'bank_proof': forms.FileInput(attrs={'class': 'form-control-file', 'required': 'required'}),
'idproof_no': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'ID Proof Number', 'required': 'required'}),
'id_proof': forms.FileInput(attrs={'class': 'form-control-file', }),
'user_doc': forms.FileInput(attrs={'class': 'form-control-file',}),
}
尝试这个:
您可以覆盖CustomUser
model 的save()
方法,而不是通过pre_save
信号更改值。
class CustomUser(AbstractUser):
sponsorId = models.CharField(max_length=256, null=True, blank=True)
mobile = models.CharField(max_length=15, null=True, 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"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.