Django笔记——04 简历投递和面试流程闭环
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_firstif '面试官' in group_names and obj.second_interviewer_user == request.user:return self.default_fieldsets_secondif '面试官' in group_names and obj.first_interviewer_user != request.user and obj.second_interviewer_user != request.user:return self.default_fieldsets_nonereturn self.default_fieldsets
2、数据集权限
get_queryset定义数据集权限,列表页展示的时候回默认调用这个方法
#对于非管理员,非HR,获取自己是一面面试官或者二面面试官的候选人集合:s
def get_queryset(self, request): # show data only owned by the userqs = 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.optsreturn 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 = Resumefields = ["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 initialdef form_valid(self, form):self.object = form.save(commit=False)self.object.applicant = self.request.userself.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_namescandidate.creator = request.user.usernamecandidate.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 = Resumetemplate_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'%s
然后将get_resume写入list_display中
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
