Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why is django throwing a system error?

I am building a custom user that uses an email as a username. When I run the server to create a custom admin, I get this error

class 'user.admin.UserAdmin'>: (admin.E116) The value of
'list_filter[0]' refers to 'is_staff', which does not refer to a
Field.

Here is my code for the admin.py

    from django import forms
    from django.contrib import admin
    from django.contrib.auth.models import Group
    from django.contrib.auth.admin import UserAdmin 
    from django.contrib.auth.forms import ReadOnlyPasswordHashField

    from .models import BaseUser

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 = BaseUser
        fields = ('email',) 

    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 != password2:
            raise forms.ValidationError('Password do not match')
        return password2

    def save(self, commit=True):
        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 = BaseUser
            fields = (
                'email',
                'password',
                'user_first_name',
                'user_last_name',
                'user_mobile',
                'is_a_student',
            )

        def clean_password(self):
            return self.initial["password"]

class UserAdmin(UserAdmin):
#Forms to add and change user instances
        form = UserChangeForm
        add_form = UserCreationForm

        #The fields to be used in displaying User model.
        #These overried the definitions on the base UserAdmin
        #That reference specific fields on auth.User


        list_display = (
            'email',
        )
        list_filter = ('is_staff',)

        fieldsets = (
            (None, {'fields': ('email', 'password')}),
            ('Personal info', {'fields': (
                'user_first_name',
                'user_last_name',
                'user_mobile',
            )}),
            ('Permission', {'fields': (
                'is_a_student',
            )})
        )

        # 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',
                    'password1',
                    'password2',
                    'user_first_name',
                    'user_last_name',
                    'user_mobile',
                    'is_a_student',
                )}
             ),
        )


        search_fields = ('email',)
        ordering = ('email',)
        filter_horizontal = ()

#Register the new UserAdmin        
admin.site.register(BaseUser, UserAdmin)
admin.site.unregister(Group)


Here is the models.py

from django.db import models
from django.core.validators import RegexValidator
from django.core.urlresolvers import reverse
from django.utils import timezone
from django.core.mail import send_mail
from django.utils.http import urlquote
from django.utils.translation import ugettext_lazy as _
from django.core.mail import send_mail
from django.core.files.storage import FileSystemStorage
from django.contrib.auth.models import (
    BaseUserManager, AbstractBaseUser, PermissionsMixin
)


class MyUserManager(BaseUserManager):
    def create_user(self, email, password=None):
        """
        Creates and saves a User with the given email and password
        """
        if not email:
            raise ValueError('Users must have an email address')

        user = self.model(email=self.normalize_email(email))
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, email, password):
        """
        Creates and saves a superuser with the given email and password
        """
        user = self.create_user(
            email=email,
            password=password,
        )
        user.is_superuser = user.is_staff = True
        user.save(using=self._db)
        return user


class BaseUser(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(
        verbose_name='email',
        max_length=255,
        unique=True,
    )

    user_first_name = models.CharField(max_length=30)
    user_last_name = models.CharField(max_length=50)
    mobile_regex = RegexValidator(regex=r'^\+?1\d{9,15}$', message="Please enter a max of 10 digits :)")
    user_mobile = models.CharField(validators=[mobile_regex], blank=True, max_length=10)
    is_a_student = models.BooleanField(default=False)
    is_staff = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    date_joined = models.DateTimeField(auto_now_add=True)

    objects = MyUserManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []

    class Meta:
        verbose_name = 'User'
        verbose_name_plural = 'Users'

    def get_full_name(self):
        return self.email

    def get_short_name(self):
        return self.email

    def __str__(self):
        return self.email

    def has_perm(self, perm, obj=None):
        """
        Does the user have a specific permission?
        """
        return True

    def is_student(self):
        return self.is_a_student

    @property
    def is_staff(self):
        """
        Is the user a member of staff?
        """
        return self.is_staff

    def emai_user(self, subject, message, from_email=None):
        send_mail(subject, message, from_email, [self.email])

Options done
- I already took out all of the is_staff attribute in admin.py and still got an error.
- Refactored it many times to check if the problem is in different areas of my code.

At this point I am stuck. Could someone please help debug this?

like image 494
chuck Avatar asked Aug 03 '26 08:08

chuck


1 Answers

#list_filter = ('is_staff',)
list_filter = ('is_admin',)
like image 50
wraith P.X Avatar answered Aug 06 '26 06:08

wraith P.X