【发布时间】:2021-03-10 16:38:51
【问题描述】:
如何让用户(员工 = True)默认使用 Django 模型,以便在管理面板中提供可用的 CRUD 操作?
我写了一些基于Django认证系统的代码:
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})
然后我创建了一个用户注册,将 Post 模型添加到管理面板。
这是 admin.py 文件
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)
这是文件 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)
对于超级用户管理面板正确显示。
但对于非超级用户,我会看到以下消息:
You don’t have permission to view or edit anything.
请告诉我我做错了什么?我必须通过不使用组来做到这一点,这个解决方案必须是完全自动化的。
P.S.:对不起,我的英语不好:) 我用的是谷歌翻译
【问题讨论】:
标签: django django-admin django-permissions