• 【Django | 开发】面试招聘信息网站(用户登录注册&投在线递简历)


    在这里插入图片描述

    该文章收录专栏
    —Django从(图文并茂轻松上手教程)专栏—✨!!

    🎏内容:
    【Djang | 增删改查】学生系统案例
    【Django | 项目搭建】快速搭建自己的项目
    【Django | allauth】登录_注册_邮箱验证_密码邮箱重置
    【Django | allauth】useprofile 用户模型扩展
    【Django | allauth】重写allauth重置密码方法
    【Django | 开发】面试招聘信息网站(快速搭建核心需求)
    【Django | 开发】面试招聘信息网站(增加csv,excel导出&日志管理功能)
    【Django | 开发】面试招聘信息网站(处理产品细节和权限&美化页面样式)
    【Django | 开发】面试招聘信息网站(划分面试官权限&集成钉钉消息)

    一、候选人登录注册

    • 方法一:使用django-registraion-reduex (不建议),
      相关配置
      在这里插入图片描述

    • 方法二:allauth 集成(建议

    【Django | allauth】登录_注册_邮箱验证_密码邮箱重置
    【Django | allauth】useprofile 用户模型扩展
    【Django | allauth】重写allauth重置密码方法

    二、创建建立模型

    1. 在jobs应用中添加如下模型
    class Resume(models.Model):
        # 这里还是要添加姓名,因为用户名不一定是真名
    	username = models.CharField(max_length=135,verbose_name=_('姓名'))
    	applicant = models.ForeignKey(User, verbose_name=_('申请人'), related_name='resume')
    	city = models.CharField(max_length=135, verbose_name=_('城市'), blank=True)
    	phone = models.CharField(max_length=135, verbose_name=_('手机号码'))
    	email = models.EmailField(max_length=135, verbose_name=_('邮箱'), blank=True)
    	gender = models.CharField(max_length=135, verbose_name=_('性别'), blank=True)
    	apply_position = models.CharField(max_length=135, verbose_name=_('应聘职位'), blank=True)
    	born_address = models.CharField(max_length=135, verbose_name=_('生源地'), blank=True)
    	candidate_remark = models.CharField(max_length=135, blank=True, verbose_name=_('候选人信息备注'))
    
    	# 学校与学历信息
    	bachelor_school = models.CharField(max_length=135, blank=True, verbose_name=_('本科生'))
    	master_school = models.CharField(max_length=135, blank=True, verbose_name=_('研究生'))
    	doctor_school = models.CharField(max_length=135, blank=True, verbose_name=_('博士生'))
    	major = models.CharField(max_length=135, blank=True, verbose_name=_('专业'))
    	degree = models.CharField(max_length=135, choices=DEGREE_TYPE, blank=True, verbose_name=_('学历'))
    
        # 自我介绍 工作经历  项目经历
        candidate_introduction = models.TextField(max_length=1048,help_text=_('自我介绍'),verbose_name=_('自我介绍'),blank=True,)
        work_experience = models.TextField(max_length=1048,help_text=_('工作经验'),verbose_name=_('工作经验'),blank=True,)
        project_experience = models.TextField(max_length=1048,help_text=_('项目经历'),verbose_name=_('项目经历'),blank=True,)
    
    	def __str__(self):
    		return self.applicant
    
    	class Meta:
    		verbose_name = _('简历')
    		verbose_name_plural = _('简历')  # 复数形式
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    1. 数据库迁移两把斧
    2. admin.py 注册该模型
    
    @admin.register(Resume)
    class ResumeAdmin(admin.ModelAdmin):
    	# exclude 不包括列表.隐藏字段(系统自定生成默认值为其值)
    	exclude = ('applicant',)
    	# 展示列表
    	list_display = ('id', 'username', 'applicant', 'phone', 'create_time', 'modify_time')
    	list_display_links = ('username',)
    
    	# list_editable = ('id',)
    	fieldsets = (
    		(None,
    		 {'fields': (
    			 'username',  'city', 'phone', 'email', 'gender', 'apply_position', 'born_address',)},
    		 ),
    		('学校信息', {'fields': ('bachelor_school', 'master_school', 'doctor_school', 'major', 'degree')}),
    		('个人能力', {'fields': ('candidate_introduction', 'work_experience', 'project_experience'),}
    
    		 ))
    
    	# 保存简历外键
    
    	def save_model(self, request, obj, form, change):
    		obj.applicant = request.user
    		super().save_model(request, obj, form, change)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    4.效果
    在这里插入图片描述

    三、用户在线投递简历

    在这里插入图片描述

    1)创建视图与模板

    1. 创建类视图(与之前的函数不一样)
      这里的类试图有很多写好的基类视图,如detailview,listview
      官方文档
    # 类视图
    class ResumeCreateView(LoginRequiredMixin, CreateView):
    	""" 简历视图 """
    	template_name = 'resume_form.html'
    	model = Resume
    	success_url = reverse('jobs:jobList')
    
    	fields = ('username', 'city', 'phone', 'email', 'gender', 'apply_position', 'born_address', 'bachelor_school',
    	          'master_school', 'doctor_school', 'major', 'degree', 'candidate_introduction', 'work_experience',
    	          'project_experience')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    1. 创建模板 resume.html
    {# 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 %}
    
    
    doctype html>
    <html lang="zh-CN">
    <head>
    	<meta charset="utf-8">
    	<title>Resume_form title>
    
    	<style>
          .bd-placeholder-img {
            font-size: 1.125rem;
            text-anchor: middle;
            -webkit-user-select: none;
            -moz-user-select: none;
            -ms-user-select: none;
            user-select: none;
          }
    
          @media (min-width: 768px) {
            .bd-placeholder-img-lg {
              font-size: 3.5rem;
            }
          }
    
    	
    	style>
    
    
    	
    head>
    <body class="bg-light">
    
    <div class="container">
    	
    	<div class="py-5 text-center">
    		<img class="d-block mx-auto mb-4" src="https://p0.ssl.img.360kuai.com/t011ad70fa7f3d778f4.jpg?size=650x433"
    			 alt="" width="72"
    			 height="72">
    		<h2>Send your emailh2>
    		<p class="lead">send your email so that interviewer can get your resume .p>
    	div>
    	
    	<div class="container">
    		<div class="col-md-8 order-md-1 d-block mx-auto ">
    			<h4 class="mb-3">Resumeh4>
    			<form class="needs-validation" novalidate method="post">
    				{% csrf_token %}
    				<div class="mb-3">
    					{% bootstrap_form form %}
    				div>
    				<hr class="mb-4">
    				<button class="btn btn-primary btn-lg btn-block" type="submit">Sendbutton>
    			form>
    		div>
    	div>
    	
    	<footer class="my-5 pt-5 text-muted text-center text-small">
    		<p class="mb-1">© 2017-2022 Hogwartsp>
    		<ul class="list-inline">
    			<li class="list-inline-item"><a href="#">Privacya>li>
    			<li class="list-inline-item"><a href="#">Termsa>li>
    			<li class="list-inline-item"><a href="#">Supporta>li>
    		ul>
    	footer>
    div>
    
    
    body>
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    1. 添加到url.py
    from django.urls import re_path
    
    from jobs import views
    app_name = 'jobs'
    urlpatterns = [
        re_path(r'^$', views.jobList, name='jobList'),
        re_path(r'^job/(?P[\d]+)/$', views.jobItem, name='jobItem'),
        re_path(r'^resume_form/$', views.ResumeCreateView.as_view(), name='resumeForm')
    ]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述

    2) 优化表单细节

    这里我们工作的城市 和 职位并没有带到表单中

    • 解决: 在类视图写上 初始化方法get_initial
    # 类视图
    class ResumeCreateView(LoginRequiredMixin, CreateView):
    	""" 简历视图 """
    	·······
    	# 初始化
    	def get_initial(self):
    		initial = {}
    		for message in self.request.GET:
    			initial[message] = self.request.GET[message]
    		return initial
    
    	def form_valid(self, form):
    		# 生成对象     (不直接提交)
    		self.object = form.save(commit=False)
    		# 添加表单中所没有的数据
    		self.object.applicant = self.request.user
    		# 保存
    		self.object.save()
    		# 返回url
    		return HttpResponseRedirect(self.success_url)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • job_item.html添加参数

    让简历进入到面试流程

    在这里插入图片描述

    1. admin.py添加如下代码
    
    @admin.action(description="进入面试流程", permissions=['to_interview', ])
    def enter_interview_process(modeladmin, request, querset):
    	# 累加人数名字
    	candidate_name = ''
    	for resume in querset:
    		candidate = Candidate()
    		# __dict__ 属性就是全部的字典值
    		candidate.__dict__.update(resume.__dict__)
    		candidate.creator = request.user
    		candidate_name = candidate.username + ',' + candidate_name
    		candidate.save()
    	messages.add_message(request, message="候选人:%s已成功进入面试流程" % candidate_name,level=messages.INFO)
    
    
    # admin.site.register(Jobs,JobAdmin)
    
    @admin.register(Resume)
    class ResumeAdmin(admin.ModelAdmin):
    	# 函数调用  不是字符串
    	actions = [enter_interview_process ]
    	def has_to_interview_permission(self, request):
    		"""Does the user have the export permission?"""
    
    		# 得到model 的 meta数据
    		opts = self.opts
    		return request.user.has_perm('%s.%s' % (opts.app_label, 'enter_interview_process'))
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    1. 添加该功能权限
      添加permission,方法同之前文章一样,这里就不赘述了。

    在这里插入图片描述

    • 添加成功

    在这里插入图片描述
    在这里插入图片描述

    		        🤞到这里,如果还有什么疑问🤞
    		🎩欢迎私信博主问题哦,博主会尽自己能力为你解答疑惑的!🎩
    			🥳如果对你有帮助,你的赞是对博主最大的支持!!🥳
    
    • 1
    • 2
    • 3
  • 相关阅读:
    SonarQube集成Jenkins平台搭建
    ICMP差错包
    LeetCode高频题34. 在排序数组中查找元素的第一个和最后一个位置
    手机也可以搭建个人博客?安卓Termux+Hexo搭建属于你自己的博客网站【cpolar实现公网访问】
    查看磁盘信息命令和查看目录以及文件占用空间大小命令
    通过DIN算法进行深度特征组合商品推荐 数据+代码(可作为毕设)
    分布式搜索———黑马旅游
    [附源码]java毕业设计研究生管理系统
    Java.lang.Class类 newInstance()方法有什么功能呢?
    什么是网络编程(一)
  • 原文地址:https://blog.csdn.net/weixin_66526635/article/details/125809875