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