场景:需要对数据进行操作,比如导出,状态变更 (如 标记候选人为 “待面试”)
定义按钮的实现逻辑(处理函数) & 在 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 模型绑定了两个权限