0

How can I make the Django model available by default, for users (Staff = True), to make available CRUD actions in the admin panel?

I wrote some code based on the Django authentication system:

from django.db import models
from django.contrib.auth.models import AbstractUser
from .manager import CustomUserManager
from django.urls import reverse
from pytils.translit import slugify



class CustomUser(AbstractUser):
    username = None  # removing username field
    email = models.EmailField(unique=True)
    is_staff = models.BooleanField(default=True)
    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []

    objects = CustomUserManager()



class _TimedModel(models.Model):

    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta(object):
        abstract = True


class Post(_TimedModel):
    title = models.CharField(max_length=100)
    body = models.TextField()
    slug = models.SlugField(null=False, unique=True)
    author = models.ForeignKey('blog.CustomUser', on_delete=models.CASCADE, related_name="post")


    objects = models.Manager()

    def save(self, *args, **kwargs):
        self.slug = slugify(self.title)
        super(Post, self).save(*args, **kwargs)

    class Meta(object):
        verbose_name = 'Post'
        verbose_name_plural = 'Post'


    def str(self):
        return self.title


    def get_absolute_url(self):
        return reverse('post_detail', kwargs={'slug': self.slug})

Then I created a user registration, added the Post model to the admin panel.

This is the admin.py file

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin

from .forms import CustomUserCreationForm, CustomUserChangeForm
from .models import CustomUser, Post


class CustomUserAdmin(UserAdmin):
    add_form = CustomUserCreationForm
    form = CustomUserChangeForm
    model = CustomUser
    list_display = ('email', 'is_staff', 'is_active',)
    list_filter = ('email', 'is_staff', 'is_active',)
    fieldsets = (
        (None, {'fields': ('email', 'password')}),
        ('Permissions', {'fields': ('is_staff', 'is_active')}),
    )
    add_fieldsets = (
        (None, {
            'classes': ('wide',),
            'fields': ('email', 'password1', 'password2', 'is_staff', 'is_active')}
        ),
    )
    search_fields = ('email',)
    ordering = ('email',)


admin.site.register(CustomUser, CustomUserAdmin)



class PostAdmin(admin.ModelAdmin):
    list_display = ('title', 'body',)
    prepopulated_fields = {'slug': ('title',)}

admin.site.register(Post, PostAdmin)

And this is the file manager.py

from django.contrib.auth.base_user import BaseUserManager
from django.utils.translation import ugettext_lazy as _
from django.contrib.auth.models import Permission


class CustomUserManager(BaseUserManager):
    def create_user(self, email: str, password, **extra_fields):
        if not email:
            raise ValueError(_('The Email must be set'))
        email = self.normalize_email(email)
        user = self.model(email=email, **extra_fields)
        user.set_password(password)
        extra_fields.setdefault('is_staff', True)
        permission = Permission.objects.get(name='Can add Post')
        user.user_permissions.add(permission)
        # user.user_permissions.add(Permission.objects.get(codename="add_post"))
        user.save()
        return user

    def create_superuser(self, email: str, password, **extra_fields) :
        extra_fields.setdefault('is_staff', True)
        extra_fields.setdefault('is_superuser', True)
        extra_fields.setdefault('is_active', 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(email, password, **extra_fields)

For superusers admin panel correctly displays.

But for non-superusers I see this message:

You don’t have permission to view or edit anything.

Please tell me what am I doing wrong? I have to do this by not using groups, this solution must be fully automated.

P.S.: Please, sorry, for my bad English :) I used the Google Translator

1 Answers1

0

Everything I needed, I found here