django admin 权限配置(类级别配置和字段级别配置)

    一个常用的 Django admin 特性是它的权限系统,该系统可以扩展以包含低级权限。默认情况下,admin 可以细粒度控制角色和权限,但是这些角色仅应用于类级别:用户可以修改所有 所有文章  或者只修改自己发布的文章。

    只允许用户修改特定的对象。这常常称为低级 权限,因为它们只能修改特定数据库表格行。

    而综合权限可以修改表格中的任何记录。样例应用程序中的情况可能是您只希望用户看到他们创建的 文章。

1.新建Article

class Article(models.Model):
    
    author = models.ForeignKey(Employee,verbose_name='发布人')
    title = models.CharField('标题',max_length=20)
    times = models.DateTimeField('发布时间',auto_now=True)
    hits = models.IntegerField('点击量',max_length=1,null =True, blank=True,default=0)
    content = models.TextField('内容',null =True, blank=True,)
    comment=models.ManyToManyField(Comment,verbose_name='评论',null =True, blank=True,)

2.新建admin.py,修改

class ArticleAdmin(admin.ModelAdmin):
    list_display = ('author','title',)
    readonly_fields=('comment',)

 

#如果 'author' 的值是 None,那么这就是一个尚未保存的新记录。

#(您还可以检查 change 是否为 false,这指示是否将添加记录,

#但是检查 'author' 是否为空表示是否填写添加到 admin 之外的记录)。

#另一个低级权限是将文档列表限制在创建它们的用户范围内。ModelAdmin 类为此提供了一个钩子程序 —— 它有一个名为queryset() 的方法,#该方法可以确定任何列表页面返回的默认查询集。

    def save_model(self, request, obj, form, change):
        if getattr(obj, 'author', None) is None:
            print obj.author,'-------------------obj.author'
            obj.author = request.user
        obj.last_modified_by = request.user
        obj.save()
    def queryset(self, request):
        qs = super(ArticleAdmin, self).queryset(request)

        # If super-user, show all comments
        if request.user.is_superuser:
            return qs
       
        return qs.filter(author=request.user)

 

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要将Django Admin中编辑用户权限和组的操作记录在指定的数据库中,您需要执行以下步骤: 1. 在您的Django项目中创建一个新的应用程序,用于记录操作日志。您可以将其命名为“logs”或似的名称。 2. 在您的“logs”应用程序中创建一个新的模型,用于记录用户权限和组编辑操作的详细信息。例如,您可以创建一个名为“UserActionLog”的模型,并将其定义如下: ``` from django.db import models from django.contrib.auth.models import User, Group class UserActionLog(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE) group = models.ForeignKey(Group, on_delete=models.CASCADE) action = models.CharField(max_length=100) timestamp = models.DateTimeField(auto_now_add=True) def __str__(self): return f"{self.user.username}: {self.action} {self.group.name}" ``` 该模型包括一个外键引用“User”和“Group”模型,以及一个用于记录操作的“action”字段和一个时间戳字段。 3. 在您的Django项目的“settings.py”文件中配置日志记录应用程序的数据库。例如,如果您使用PostgreSQL数据库,您可以添加以下设置: ``` DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': 'mydatabase', 'USER': 'mydatabaseuser', 'PASSWORD': 'mypassword', 'HOST': 'localhost', 'PORT': '5432', }, 'logs': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': 'mylogsdatabase', 'USER': 'mylogsdatabaseuser', 'PASSWORD': 'mypassword', 'HOST': 'localhost', 'PORT': '5432', } } DATABASE_ROUTERS = ['logs.routers.LogsRouter'] ``` 这将为您的日志记录应用程序配置一个新的PostgreSQL数据库,并将其命名为“logs”。它还将指定一个名为“LogsRouter”的路由器,该路由器将Django Admin的所有操作记录到“logs”数据库中。 4. 在您的“logs”应用程序中创建一个名为“routers.py”的文件,并定义一个名为“LogsRouter”的路由器,如下所示: ``` class LogsRouter: def db_for_read(self, model, **hints): if model._meta.app_label == 'logs': return 'logs' return None def db_for_write(self, model, **hints): if model._meta.app_label == 'logs': return 'logs' return None def allow_relation(self, obj1, obj2, **hints): if obj1._meta.app_label == 'logs' or obj2._meta.app_label == 'logs': return True return None def allow_migrate(self, db, app_label, model_name=None, **hints): if app_label == 'logs': return db == 'logs' return None ``` 该路由器将所有与“logs”应用程序相关的模型操作路由到“logs”数据库中。 5. 在您的“logs”应用程序中创建一个名为“admin.py”的文件,并将以下代码添加到文件中: ``` from django.contrib.admin.models import LogEntry from django.contrib.auth.models import User, Group from django.contrib.contenttypes.models import ContentType from django.dispatch import receiver from django.db.models.signals import post_save, post_delete from .models import UserActionLog @receiver(post_save, sender=User) def log_user_save(sender, instance, **kwargs): content_type = ContentType.objects.get_for_model(instance) log_entry = LogEntry.objects.filter( content_type=content_type, object_id=instance.id, action_flag=2 ).latest('id') user_action = UserActionLog( user=instance, group=None, action=log_entry.get_change_message(), ) user_action.save() @receiver(post_save, sender=Group) def log_group_save(sender, instance, **kwargs): content_type = ContentType.objects.get_for_model(instance) log_entry = LogEntry.objects.filter( content_type=content_type, object_id=instance.id, action_flag=2 ).latest('id') user_action = UserActionLog( user=None, group=instance, action=log_entry.get_change_message(), ) user_action.save() @receiver(post_delete, sender=User) def log_user_delete(sender, instance, **kwargs): user_action = UserActionLog( user=instance, group=None, action='User deleted', ) user_action.save() @receiver(post_delete, sender=Group) def log_group_delete(sender, instance, **kwargs): user_action = UserActionLog( user=None, group=instance, action='Group deleted', ) user_action.save() ``` 这将使用Django信号来捕获Django Admin中与用户和组相关的所有操作,并将其记录到“logs”数据库中的“UserActionLog”模型中。 完成这些步骤后,您现在可以在Django Admin中编辑用户权限和组时记录操作。这些操作将被记录在“logs”数据库中的“UserActionLog”模型中。您可以使用Django ORM查询这些记录并将它们用于分析和监控用户操作。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值