17.增加自定义数据操作菜单

103 阅读1分钟

场景:需要对数据进行操作,比如导出,状态变更 (如 标记候选人为 “待面试”)

定义按钮的实现逻辑(处理函数) & 在 ModelAdmin 中注册函数到 actions

wangdalei_dj/interview/admin.py

from django.contrib import admin

# Register your models here.

from interview.models import Candidate


import csv
from datetime import datetime
from django.http import HttpResponse

exportable_fields = ('username', 'city', 'phone', 'bachelor_school', 'master_school', 'degree', 'first_result', 'first_interviewer_user',
                     'second_result', 'second_interviewer_user', 'hr_result', 'hr_score', 'hr_remark', 'hr_interviewer_user')


# 导出文件功能
def export_model_as_csv(modeladmin, request, queryset):
    response = HttpResponse(content_type='text/csv')
    field_list = exportable_fields

    time_1 = datetime.now().strftime('%Y-%m-%d-%H-%M-%S')
    response['Content-Disposition'] = 'attachment; filename=recruitment-candidates-list-%s.csv' % (time_1)

    # 写入表头
    writer = csv.writer(response)
    writer.writerow(
        [queryset.model._meta.get_field(f).verbose_name.title() for f in field_list],
    )

    for obj in queryset:
        ## 单行 的记录(各个字段的值), 根据字段对象,从当前实例 (obj) 中获取字段值
        csv_line_values = []
        for field in field_list:
            field_object = queryset.model._meta.get_field(field)
            field_value = field_object.value_from_object(obj)
            csv_line_values.append(field_value)
        writer.writerow(csv_line_values)

    return response

# 页面展示的菜单名称
export_model_as_csv.short_description = u'导出为CSV文件'
# export_model_as_csv.allowed_permissions = ('export',)

# 候选人管理类
class CandidateAdmin(admin.ModelAdmin):

    # 动作菜单栏中 添加新的动作
    actions = [export_model_as_csv, ]

    # 展示列表的字段
    list_display = (
        'username', 'city', 'bachelor_school', 'first_score', 'first_result', 'first_interviewer_user',
        'second_score',
        'second_result', 'second_interviewer_user', 'hr_score', 'hr_result', 'hr_interviewer_user',)

    # 右侧筛选条件
    list_filter = ('city','first_result','second_result','hr_result','first_interviewer_user','second_interviewer_user','hr_interviewer_user')

    # 查询字段
    search_fields = ('username', 'phone', 'email', 'bachelor_school')

    ### 列表页排序字段
    ordering = ('hr_result', 'bachelor_school', 'second_result', 'first_result',)

admin.site.register(Candidate, CandidateAdmin)

candidate 模型绑定了两个权限

image.png

image.png