简体   繁体   中英

Django Superuser cant change user permission - change user type to staff

I am creating a Django Project with python 3.6 & Django V 2.2. Now in the Django Admin panel ( Super User) cant convert a user type to staff. also it is not able to edit some user fields also. I have tried DB.Sqlite on my Local Host and PostgreSQL DB ( PG Admin on ) Apache2 Server. Kindly provide me any solution for my problem. I have been described all related codes below. also find the attached file for my problem. Django Admin shows success message. But No result on action ( https://i.ibb.co/tDstxff/django-adminerror.png ) Error after change user to staff

My Project files are: 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

And the Admin.py file in the Users App is

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)

Also I have Pasted the Users/Views.py for Registrationview

# 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

And finally this is my User Change Form in 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',}),
        }

Try this:

Instead of changing the values through a pre_save signal you can override the save() method for CustomUser model.

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"

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM