DjangoAdmin中各个函数的功能说明

admin

    • 重写方法:

def delete_model(self, request, obj)
def delete_queryset(self, request, queryset)
def get_search_results(self, request, queryset, search_term) # Use other search engines Haystack
def save_related(self, request, form, formsets, change)
def get_autocomplete_fields(self, request) #  该方法返回list或tuple的字段名称,该字段名称将与自动完成小部件一起显示 。
def get_readonly_fields(self, request, obj=None) # 该方法返回将显示为只读的字段名称的list或tuple

def get_exclude(self, request, obj=None) # 该方法返回exclude的字段列表

def get_fields(self, request, obj=None) # 返回fields。
def get_fieldsets(request, obj=None) # 该方法返回一个二元列表,fieldsets

def get_list_filter(self, request) # 返回list_filter。
def get_list_display(self, request) # 该方法返回list或tuple的字段名称,该名称将显示在更改列表视图中
def get_list_select_related(self, request) # return a list or tuple
def get_list_display_links(request, list_display) # 返回将链接到变更视图的变更列表中的一个None或一个list或tuple多个字段名称

def get_sortable_by(self, request) # 返回一个集合(如list,tuple或set)字段名,通过该集合进行排序。
def get_inline_instances(self, request, obj=None) # return a list or tuple of InlinesModelAdmin
def get_inlines(self, request, obj) # You can override this method to dynamically add inlines
    • 重写视图和权限:

# Permissions related
def has_add_permission(self, request) # 是否具有添加数据的权限。如果允许添加对象,应返回 True,否则应返回 False。
def has_view_permission(self, request, obj=None) # 如果允许查看 obj,应返回 True,否则应返回 False。如果 obj 为 None,则应返回 True 或 False 以指示是否允许查看此类型的对象(例如,False 将解释为不允许当前用户查看此类型的任何对象),如果用户具有"更改"或"查看"权限,则默认实现将返回 True。
def has_change_permission(self, request, obj=None) # 是否具有change权限。 如果允许编辑 obj,应返回 True,否则应返回 False。如果 obj 为"无",则应返回 True 或 False 以指示通常是否允许编辑此类型的对象
def has_delete_permission(self, request, obj=None)  # 是否具有delete权限。 如果允许删除 obj,应返回 True,否则应返回 False。如果 obj 为"无",则应返回 True 或 False 以指示通常是否允许删除此类型的对象。
def has_module_permission(self, request)# 如果允许在管理页上显示模块并访问模块,则应返回 True,否则为 False。默认情况下使用 User.has_module_perms() 。虽然设置为True后不显示该模块,但是通过url依然可以访问。
 
 
# Other view methods
def add_view(self, request, form_url='', extra_context=None)
def change_view(self, request, object_id, form_url='', extra_context=None)
def changelist_view(self, request, extra_context=None)
def delete_view(self, request, object_id, extra_context=None)
def history_view(self, request, object_id, extra_context=None)
    • 对展示的数据进行过滤

'对展示的数据进行过滤'
    def get_queryset(self, request):
        qs = super().get_queryset(request)
        if request.user.is_superuser:
            return qs
        else:    #不是超级管理员,只展示跟跟自己场域一样的用户信息
            return qs.filter(belong=request.user.belong)
    • 对展示的字段进行判断

'对展示的字段进行判断'
    def get_list_display(self, request):
        # 如果是超级管理员,展示养殖场所用信息
        if request.user.is_superuser:
            return self.list_display
        else:   #不是超级管理员
            list_display=copy.deepcopy(self.list_display)
            list_display.remove('id')
            list_display.remove('change')
            list_display.insert(0,'chakan')   #在第一个位置插入‘查看’功能
            return list_display
    • 详情列表添加自定义字段按钮

from django.utils.html import format_html 
    
    list_display = ['delete','look','xiazai','custom_date']

    # model.py中create date = models.DateTimeField(auto now add=True)
    def custom_date(self, obj):
            return format_html(
                '{}',
                obj.create_date.strftime("%Y-%m-%d %H:%M:%S")
            )
 
 
    custom_date.short_description = '设置时间的格式和颜色'  

    def delete(self,obj):
            return format_html('

删除

',obj.id)         delete.short_description = '删除'     def look(self,obj): return format_html('查看详细',obj.id) look.short_description='查看详细'     def xiazai(self,obj): return format_html('

下载

',obj.id) xiazai.short_description='下载'     #自定义admin后台显示字段 def view_birth_date(self, obj): # 自定义的字段,obj为当前model对象 # Upper是数据库函数,用于将字符串中的小写字母全部转换成大写字母输出 return ("%s %s" % (obj.variety, obj.name)).upper()
    • django前端添加自定义按钮

    def 自定义名称(self,request,queryset):
        return TemplateResponse(request, 'actions/form.html', context)
    自定义名称.short_description = 'xxxx'

    actions = [自定义名称]
    • 编辑保存增加按钮的功能

    def save_model(self, request, obj, form, change):
        '''如果直接写代码,这包含增加和修改两个功能,如果需要单独设置则按照下面的写'''
        if change: #点击修改执行的下面的代码
            obj.user = request.user  # 在保存之前执行的操作
            print(obj)
            super().save_model(request, obj, form, change)  # 执行保存
            # 此处写保存后需要执行的操作   
    def save_model(self, request, obj, form, change):
        print('查看sava_madel中的obj和self')
        print(obj)    #obj表示新增的对象,具体值由model中的  def __str__(self)   决定
        print(self)   #  animal.AnimalInfoAdmin

        if obj.father ==None:
            obj.father=AnimalInfo.objects.get(id=1)
        if obj.mother ==None:
            obj.mother=AnimalInfo.objects.get(id=2)
        super().save_model(request, obj, form, change)
        # 预警
        if not change:   #新增
            creat_list = []

            # 如果用户是超级管理员,belong为空
            belong = None if request.user.is_superuser else request.user.belong
            # if request.user.is_superuser:
            #     belong = None
            # else:
            #     request.user.belong

            warning_date=obj.birth_date+datetime.timedelta(days=60)

            '新加一个动物信息后,免疫预警信息会批量保存该动物的疫苗信息'
            for vaccine in range(1,7):
                creat_list.append(
                    Immunity_Alert_Info(      #免疫预警信息
                        animal=obj,       #self_num
                        immunity_name=vaccine,   #免疫名称
                        belong=belong,   #belong在上面的代码中做了判断,如果是超级管理员,belong为空
                        warning_date=warning_date   #预警日期
                    )
                )
                warning_date = warning_date + datetime.timedelta(days=60)

            # Django批量保存数据库 bulk_create 方法
            Immunity_Alert_Info.objects.bulk_create(creat_list)
            super().save_model(request, obj, form, change)
    • 编辑删除和增加权限

    def has_add_permission(self, request):    #覆盖增加按钮
        return False

    def has_delete_permission(self, request, obj=None):    #覆盖删除按钮
        return False

    
    • 在详情页面添加自定义的只读字段

# 在详情页面添加自定义的只读字段
    readonly_fields = ('address_report',)

    def address_report(self, instance):
        return 'xxx'
    • 编辑删除单条数据功能

    def delete_model(self, request, obj):
        """
        删除单条记录
        同时删除配方成分表中的数据
        """
        obj.delete()
    • 编辑选中一个或多个数据复选框进行的删除按钮功能

    def delete_queryset(self, request, queryset):
        """Given a queryset, delete it from the database."""
        queryset.delete()
    • 编辑对于超管和普通用户对只读字段的修改权限

    '''
    超级管理员可以更改只读属性的字段,普通用户不可以!!!
    如果需要执行这个功能,则需要将上面readonly_fields = ['sheep_kind','name','weight',]这行代码注释
    def get_readonly_fields(self, request, obj=None):

        """  重新定义此函数,限制普通用户所能修改的字段  """
    '''

        if request.user.is_superuser:

            self.readonly_fields = []

        return self.readonly_fields

    readonly_fields = ('sheep_kind','name','weight',)
    • 编辑不同超管和普通用户的字段排序

'''get_ordering方法将request作为参数,并预期返回一个列表或元组,以便进行类似于ordering属性的排序。'''
    def get_ordering(self, request):
        if request.user.is_superuser:  # 判断是不是超级用户
            print('----------')
            return ['variety','name',]
        else:
            return ['name']

你可能感兴趣的:(python,django,开发语言)