1、制作更美化的页面
django-grappelli、bootstrap、swift、Xadmin、tailwind
安装django-grappelli风格:
pip install django-grappelli
在settings.py中的配置:
INSTALLED_APPS = ('grappelli', 'django.contrib.admin')
urls.py 中添加URL映射:
urlpatterns = [
path('grappelli/', include('grappelli.urls')),
#path('admin/', admin.site.urls)
]
2、定制面试官权限
数据权限:
- 专业面试官仅能评估自己负责的环节
数据集权限:
- 专业面试官只能看到分到自己的候选人
功能权限:
- 数据导出权限仅次HR和超级管理员可用
1、数据权限:
用get_fieldsets函数确定用户点击详情页时所能看到和操作的信息,返回的是控制fieldsets的内容:
def get_fieldsets(self, request, obj=None):
group_names = self.get_group_names(request.user)
if '面试官' in group_names and obj.first_interviewer_user == request.user:
return self.default_fieldsets_first
if '面试官' in group_names and obj.second_interviewer_user == request.user:
return self.default_fieldsets_second
if '面试官' in group_names and obj.first_interviewer_user != request.user and obj.second_interviewer_user != request.user:
return self.default_fieldsets_none
return self.default_fieldsets
2、数据集权限
get_queryset定义数据集权限,列表页展示的时候回默认调用这个方法
#对于非管理员,非HR,获取自己是一面面试官或者二面面试官的候选人集合:s
def get_queryset(self, request): # show data only owned by the user
qs = super(CandidateAdmin, self).get_queryset(request)
group_names = self.get_group_names(request.user)
if request.user.is_superuser or 'hr' in group_names:
return qs # 返回的是所有的数据集
return Candidate.objects.filter(Q(first_interviewer_user=request.user) | Q(second_interviewer_user=request.user))
django里面有一个Q表达式,可以用来去做or的查询,到数据库里面做or或and或or和and的复杂查询
3、功能权限
普通用户没有导出csv文件的功能
在model的Meta里面可以定义权限,权限的定义需要同步到数据库中
permissions = [
("export", "Can export candidate list"), # 导出权限,可以导出候选人列表
("notify", "notify interviewer for candidate review"), # 通知权限,可以通知面试官准备做面试
]
定义权限之后可以在admin里面设置谁有权限,谁没有权限
# 导出按钮的权限,如果用户有export的权限,则运行调用allowed_permissions这个方法,则菜单会展示出来
export_model_as_csv.allowed_permissions = ('export', )
CandidateAdmin中定义方法检测当前用户有无导出权限
# 当前用户是否有导出权限:
def has_export_permission(self, request):
opts = self.opts
return request.user.has_perm('%s.%s' % (opts.app_label, "export")) # 用户有无权限用user.has_perm判断,opts.app_label取得candidate,看的是candidate.export
3、允许候选人注册登陆——继承Registration
用allauth也有类似的效果
原先定义的base.html也是Registration里面的一个模板文件,所以自定义的base.html覆盖了原始的模板文件,若想要修改页面样式,也是需要将HTML文件复制到项目中来
在settings的配置:
LOGIN_REDIRECT_URL = '/' # 登陆成功后跳转的链接
SIMPLE_BACKEND_REDIRECT_URL = '/accounts/login/' # 注册成功后跳转的链接
4、创建建立model
- 创建model
- 注册model到admin中,设置展示字段
- 同步数据库
- 授予管理权限到HR
5、候选人可以在线投递简历
目标:
- 注册用户可以提交简历
- 简历跟当前用户关联
- 能够追溯到谁投递的简历
步骤:
- 定义简历创建View(继承自通用的CreateView)
- 定义简历创建页面的表单模板
- 关联“申请职位”按钮的点击事件到简历提交页
- 进一步完善,可以带参数跳转&&关联登陆用户到简历
view中定义类视图:
class ResumeCreateView(LoginRequiredMixin, CreateView): # Mixin达到让一个类能够继承多个类的目的
""" 简历职位页面 """
template_name = 'resume_form.html'
success_url = '/joblist/'
model = Resume
fields = ["username", "city", "phone",
"email", "apply_position", "gender",
"bachelor_school", "master_school", "major", "degree",
"candidate_introduction", "work_experience", "project_experience"]
### 从 URL 请求参数带入默认值
def get_initial(self):
initial = {}
for x in self.request.GET:
initial[x] = self.request.GET[x]
return initial
def form_valid(self, form):
self.object = form.save(commit=False)
self.object.applicant = self.request.user
self.object.save()
return HttpResponseRedirect(self.get_success_url())
urls.py:
path('resume/add/', views.ResumeCreateView.as_view(), name='resume-add'),
6、用bootstrap定制页面样式
{# Load the tag library #}
{% load bootstrap4 %}
{# Load CSS and JavaScript #}
{% bootstrap_css %}
{% bootstrap_javascript jquery='full' %}
{# Display django.contrib.messages as Bootstrap alerts #}
{% bootstrap_messages %}
7、简历评估和安排一面面试官
-
目标:打通简历投递与面试流程,让简历实体(Resume)流转到候选人实体(Candidate)
-
添加一个数据操作菜单“进入面试流程”
-
定义enter_interview_process方法
def enter_interview_process(model, request, queryset)
方法逻辑:拷贝Resume对象中的属性到Candidate,保存Candidate,消息提示成功保存 -
注册到modeladmin中
actions = (export_model_as_csv, notify,_interviewer, enter_interview_process,)
# 进入面试流程,就是将简历的信息添加到候选人中
def enter_interview_process(modeladmin, request, queryset):
candidate_names = ""
for resume in queryset:
candidate = Candidate()
# 把 obj 对象中的所有属性拷贝到 candidate 对象中:
candidate.__dict__.update(resume.__dict__)
candidate.created_date = datetime.now()
candidate.modified_date = datetime.now()
candidate_names = candidate.username + "," + candidate_names
candidate.creator = request.user.username
candidate.save()
messages.add_message(request, messages.INFO, '候选人: %s 已成功进入面试流程' % (candidate_names) )
enter_interview_process.short_description = u"进入面试流程"
8、定制列表查看简历详情
- 添加 ResumeDetailView 的详情页视图,使用 Django的通用视图,继承自 DetailView
- 添加 Detail 页模板: resume_detail.html
- 候选人列表页, 对于每一行来自简历投递的数据,添加一个“查看简历”的链接:
- 列表页,使用 函数名称 作为 list_display 中的字段
- 定义一个函数, 获取 简历详情页链接
定义简历的详情页,继承DetailView,DetailView是详情页的视图
class ResumeDetailView(DetailView):
""" 简历详情页 """
model = Resume
template_name = 'resume_detail.html'
interview/admin.py
# 列表页查看简历
def get_resume(self, obj): # obj是当前候选人的实体
if not obj.phone:
return ""
resumes = Resume.objects.filter(phone=obj.phone)
if resumes and len(resumes) > 0:
return mark_safe(u'<a href="/resume/%s" target="_blank">%s</a' % (resumes[0].id, "查看简历"))
return ""
get_resume.short_description = '查看简历' # 列名
get_resume.allow_tags = True
然后将get_resume写入list_display中