首页 > 解决方案 > How to add object level permission in django admin

问题描述

I have a Building model and in that i have a field notes which has GenericRelation to GeneralNote. In Building admin added GeneralNotes as Inlines. Now I want that the GeneralNotes is editable for the user who is owner of general note.

class Building(TimeStampedModel):
    name = models.CharField(                                                               unique=True, max_length=100, verbose_name=_("Building Name"), help_text=_("This is the name of your building")
    ) 
    notes = GenericRelation(GeneralNote)



class GeneralNote(TimeStampedModel):                                                           

    owner = models.ForeignKey(                                              
            CompanyEmployee,                                                    
            blank=True,                                                         
            null=True,                                                          
            # related_name='noteOwner',                                         
            on_delete=models.SET_NULL,                                          
            verbose_name="Note Owner",                                          
    )                                                                       

    content = models.TextField(max_length=400, null=True )                  
    date_of_action = models.DateField(null=True)                            
    content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE) 
    object_id = models.PositiveIntegerField()                               
    attached_to = GenericForeignKey()

In admin.py:

class BuildingAdmin(ImportMixin, GeneralNotesIncludedAdmin):
    inlines = (GeneralNoteInLine,)


class GeneralNotesIncludedAdmin(CoreBaseAdmin):                                                

    def save_formset(self, request, form, formset, change):                                    
        instances = formset.save(commit=False)                                                 

        for instance in instances:                                                             
            if not instance.owner:                                                             
                instance.owner = request.user.companyemployee                                  
            instance.save()                                                                    

        super().save_formset(request, form, formset, change)


class CoreBaseAdmin(admin.ModelAdmin):                                                         
    save_on_top = True

标签: pythondjangopython-3.x

解决方案


您可以使用以下has_change_permission方法:

class GeneralNotesIncludedAdmin(CoreBaseAdmin):
    def has_change_permission(self, request, obj=None):
        if obj is None:
            return True
        return obj.owner == request.user.companyemployee

您还可以将这些添加到InlineModelAdmin

class GeneralNoteInLine(InlineModelAdmin):
    def has_change_permission(self, request, obj=None):
        if obj is None:
            return True
        return obj.owner == request.user.companyemployee

推荐阅读