【Django | 开发】面试招聘信息网站(快速搭建核心需求)

简介: 【Django | 开发】面试招聘信息网站(快速搭建核心需求)

✨ 本文主要讲解核心思想,省略了一些细枝末节(如setting中应用的导入等)✨ 
• 1

文章目录

一、创建职位管理后台

1.1 定义用户模型

创建recruitment(招聘) 项目和 jobs应用

我们在对项目开发时,需要提前设计好整个数据表的字段(不能想到什么再加,后面修改和数据迁移操作会麻烦的多)

图片.png

  • jobs.models.py应用中创建如下模型:
from datetime import datetime
from django.contrib.auth.models import User
from django.db import models
# Create your models here.
JobType = [
    (0, '产品类'),
    (1, '技术类'),
    (2, '运营类'),
    (3, '设计类')
]
JobPlace = [
    (0, '上海市'),
    (1, '北京市'),
    (2, '惠州市'),
    (3, '广州市')
]
class Jobs(models.Model):
    job_type = models.SmallIntegerField(choices=JobType, blank=False, verbose_name='职位类别')
    job_name = models.CharField(max_length=200, blank=False, verbose_name='职位名称')
    job_place = models.SmallIntegerField(choices=JobPlace, blank=False, verbose_name='工作地点')
    job_responsibility = models.TextField(verbose_name='工作职责', blank=False, max_length=1024)
    job_require = models.TextField(max_length=2048, verbose_name='工作要求')
    # on_delete 默认为忽略这条数据, 可以设置为级联删除或者NULL, 引用函数不用()
    # 默认值为当前用户, 与用户多对一
    job_creator = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, default=User,
                                    verbose_name='创建人')  # 不能添加default=User 这里的是User 对象(不是特定的user,需要request.user
    # 不要date 要的是 datetime, 引用函数
    create_time = models.DateTimeField(verbose_name='创建日期', default=datetime.now)
    modify_time = models.DateTimeField(verbose_name='修改日期', default=datetime.now)
    def __str__(self):
        return self.job_name

1.2 在admin优化管理

from django.contrib import admin
from jobs.models import Jobs
# 方法一
@admin.register(Jobs)
class JobAdmin(admin.ModelAdmin):
    # exclude 不包括列表.隐藏字段(系统自定生成默认值为其值)
    exclude = ('create_time', 'modify_time', 'job_creator')
    # 展示列表
    list_display = ('job_name', 'job_type', 'job_place', 'job_creator', 'create_time', 'modify_time')
    # ModelAdmin父类所定义的方法 会被自动调用
    def save_model(self, request, obj, form, change):
        # object对象 由于隐藏了job_creator字段,且没有默认值,所以需要手动加上
        obj.job_creator = request.user
        # obj.save()  #  super 实例的 save_model 方法的源码是 obj.save()
        super().save_model(request, obj, form, change)
    # 方法二,绑定二者
# admin.site.register(Jobs,JobAdmin)

1.3 效果

42.gif

二、匿名用户可查看职位列表和职位详情

图片.png

  • 创建模板目录templates和配置模板目录

创建基础模板base.html

<!-- base.html -->
<h2 style="margin:auto;width:50%;">霍格沃兹</h2>
{% block_content %}
{% endblock %}
  • jobs_list.html 代码
{% extend 'base.html' %}
{% block_content %}
欢迎来到霍格沃兹
{% if jobList %}
{% for job in jobList %}
<ul>
    <li>{{ job.job_type }} <a href="/job/{{ job.id }}"></a>{{ job.job_name }}  {{ job.job_place }}</li>
</ul>
{% endfor %}
{% else %}
<p> 没有可用的职位✨</p>
{% endif %}
{% endblock %}
  • job-item.html页面(有点简陋)
{% extends 'base.html' %}
{% block content %}
<div style="margin:auto;width:50%;" class="">
    <a href="{% url 'jobList' %}" style="margin:auto;width:50%;">return list</a>
</div>
{% if job %} <!-- 如果职位为显示无职位-->
<h2 style="margin:auto;width:50%;">岗位名称:{{ job.job_name }}</h2>
<div style="margin:auto;width:50%;">
</div>
<div style="margin:auto;width:50%;font-size: 10px;">
    城市: {{ job.job_place }}
</div>
<hr>
<div style="margin:auto;width:50%;">
     <h3>工作要求:</h3>
    <pre>{{ job.job_responsibility }}</pre>
</div>
<hr>
<div style="margin:auto;width:50%;">
    <h3>工作职责:</h3>
    <pre>{{ job.job_require }}</pre>
</div>
<div style="margin:auto;width:50%;"><input type="submit" value="提交"></div>
{% else %}
<p> 职位不存在 </p>
{% endif %}
{% endblock %}
<style>
</style>
  • 效果44.gif

三、产品背景迭代思维

3.1 产品背景

图片.png

  • 表格

图片.png

  • 如何在一天之内交付面试管理系统呢,

3.2唯快不破:迭代思维

图片.png

  • 我们可以看看微信1.0版本开发迭代思想图片.png

善于利用MVP迭代思维(抓住最核心的部分实现,再通过用户的需求迭代更新)

图片.png

3.3 如何使用迭代思想

找出必须功能

图片.png

四、数据建模&企业级数据库设计原则

4.1 数据建模

图片.png

4.2 数据库设计原则

图片.png

图片.png

图片.png

五、创建应用和模型

  • 需求一:HR 可以维护候选人信息
  • 需求二:面试官可以录入面试反馈

这里按照产品迭代思维用一个功能实现即可,候选人的信息以及面试反馈信息都放在一张表中。(在admin中完成实现

  • 创建interview应用,在model.py创建模型

这里为了快速搭建核心需求,忽略了一个问题,由于一面面试官二面面试官和HR信息都直接放在了一个表里,所以这里一面二面hr面试官的foreignkey键对于得是用户,而用户处理面试官们还包括了普通用户,所以会出现在下拉选项出现可以选择应聘者得选项bug,这个读者们可以加多一个额外应聘者信息模型,外键对应面试官

from django.db import models
# Create your models here.
# 学历
DEGREE_TYPE = [
    ('本科', '本科'),
    ('硕士', '硕士'),
    ('博士', '博士')
]
# 一面
FIRST_INTERVIEW_SCORE_TYPE = [
    ('建议复试', '建议复试'),
    ('待定', '待定'),
    ('放弃', '放弃'),
]
# 复试
INTERVIEW_RESULT_TYPE = [
    ('建议录取', '建议录取'),
    ('待定', '待定'),
    ('放弃', '放弃'),
]
# HR
HR_SCORE = [
    ('S', 'S'),
    ('A', 'A'),
    ('B', 'B'),
    ('C', 'C'),
]
# 关于blank = true 放区别应聘者信息就好了(方便填表)
class Candidate(models.Model):
    # 基础信息
    user_id = models.IntegerField(verbose_name='应聘者ID', blank=True, null=True)
    user_name = models.CharField(max_length=135, verbose_name='姓名')
    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='学历')
    # 综合能力测评成绩,
    test_score_of_general_ability = models.DecimalField(max_digits=3, decimal_places=1, blank=True,
                                                        verbose_name='综合能力测评成绩', null=True)
    page_score = models.DecimalField(max_digits=3, decimal_places=1, blank=True,
                                     verbose_name='笔试成绩', null=True)
    # 第一轮面试结果
    first_score = models.DecimalField(max_digits=3, decimal_places=1, blank=True, verbose_name='初始分', null=True)
    first_result = models.CharField(choices=FIRST_INTERVIEW_SCORE_TYPE, blank=True, verbose_name='初始结果', max_length=135)
    second_interviewer = models.CharField(max_length=135, blank=True, verbose_name='面试官')
    # 第二轮面试结果
    second_score = models.DecimalField(max_digits=3, decimal_places=1, blank=True, verbose_name='初始分')
    second_result = models.CharField(choices=INTERVIEW_RESULT_TYPE, blank=True, verbose_name='复试结果', max_length=135)
    first_interviewer = models.CharField(max_length=135, blank=True, verbose_name='面试官')
    # HR
    hr_score = models.DecimalField(max_digits=3, decimal_places=1, blank=True, verbose_name='hr复试得分')
    hr_result = models.CharField(choices=HR_SCORE, blank=True, verbose_name='复试结果', max_length=135)
    hr_interviewer = models.CharField(max_length=135, blank=True, verbose_name='面试官')
    # 每张表都需要的原则
    create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
    modify_time = models.DateTimeField(auto_now=True, verbose_name='修改时间')
    class Mate:
        db_table = 'candidate'
        verbose_name = '应聘者'
        verbose_name_plural = '应聘者'  # 复数形式
    # python 3方法,2是 unicode  把对象转换为字符串(当遇到数据类型转换时返回该字符串,与c++转换构造函数一样。遇到其他类型指定转换值)
    def __str__(self):
        return self.user_name
  • admin.py
from django.contrib import admin
from interview.models import Candidate
# Register your models here.
@admin.register(Candidate)
class CandidateAdmin(admin.ModelAdmin):
    list_display = ('user_id', 'user_name', 'phone', 'city')
  • 三板斧运行服务器

46.gif

六、优化admin

6.1 分组填写

  • 很显然,表的结构太复杂,因为字段太多,所以我们需要优化admin,实现分组填写
from django.contrib import admin
from interview.models import Candidate
# Register your models here.
@admin.register(Candidate)
class CandidateAdmin(admin.ModelAdmin):
    list_display = ('user_id', 'user_name', 'first_result', 'second_result', 'hr_result', 'create_time', 'modify_time')
    # 定义集合的字段列表
    fieldsets = (
        # 第一个元素表示分组展现的名字,第二元素是一个map
        (None, {'fields': (
            "apply_position", "bachelor_school", "born_address", "candidate_remark", "city", "degree",
            "doctor_school", "email", "gender", "major", "master_school",  "page_score", "phone",
            "test_score_of_general_ability", "user_id", "user_name",
        )}),
        ('第一轮面试', {'fields': ("first_score", "first_result", "second_interviewer",
                             )}),
        ('第二轮面试', {'fields': ("second_score", "second_result", "first_interviewer",
                             )}),
        ('第三轮面试', {'fields': ("hr_score", "hr_result", "hr_interviewer",
                             )})
    )
  • 分组实现成功图片.png

6.2 将类别一样的信息放在同一行

from django.contrib import admin
from interview.models import Candidate
# Register your models here.
@admin.register(Candidate)
class CandidateAdmin(admin.ModelAdmin):
    list_display = ('user_id', 'user_name', 'first_result', 'second_result', 'hr_result', 'create_time', 'modify_time')
    # 定义集合的字段列表
    fieldsets = (
        # 第一个元素表示分组展现的名字,第二元素是一个map
        (None, {'fields': ("user_id", ("user_name", "email", "gender", "phone",),
                           ("apply_position", "degree"),
                           ("city", "born_address"),
                           ("doctor_school", "bachelor_school", "master_school", "major",), ("page_score",
                                                                                             "test_score_of_general_ability",
                                                                                             "candidate_remark",),
                           )}),
        ('第一轮面试', {'fields': ("first_score", "first_result", "second_interviewer",
                              )}),
        ('第二轮面试', {'fields': ("second_score", "second_result", "first_interviewer",
                              )}),
        ('第三轮面试', {'fields': ("hr_score", "hr_result", "hr_interviewer",
                              )})
    )
  • 效果47.gif

如果对django model,admin有更多用法,可以去官方看看

https://docs.djangoproject.com/en/3.2/ref/models/querysets/#only

参考文献:

Django中max_length限制长度注意事项

auto_now & auto_now_add

函数引用和调用

Python中文编码问题(字符串前面加’u’)

网络编码那些事

Django model 字段类型——models.DecimalField

✨谢谢你的阅读,你的点赞和收藏是我创作的最大动力✨



相关文章
|
1天前
|
存储 前端开发 关系型数据库
105-Django开发多商户询盘上级网站-在线聊天交流通讯
该项目旨在构建一个在线询盘交易系统,采用Python的Django框架,支持SQLite3(开发)或MySQL/PostgreSQL(生产)数据库。功能包括用户注册登录、产品上传(带审核)、搜索过滤、即时通讯、超级用户管理端、数据分析和响应式界面。还将考虑使用WebSocket、Redis缓存、Docker部署和推荐算法。数据库设计涉及用户、产品、订单和聊天记录表。开发流程涵盖需求分析、技术选型、数据库设计、编码、测试和部署,同时关注安全性、性能、可维护性和兼容性。
10 2
|
1天前
|
缓存 数据挖掘 数据库
104-Django开发在线美食购物网站
美味小厨在线购物网站是基于Python和Django构建的电商平台,提供商品展示、搜索过滤、问题反馈、购物功能、商品详情查看、产品编辑添加、多用户及站点管理、订单管理等服务。采用Django框架实现高效、稳定且可扩展的系统,前后端分离以提升性能,支持数据库优化和缓存技术,注重用户数据安全。未来计划优化用户体验,拓展更多功能,并加强数据分析。
8 1
|
1天前
|
BI Python
103-Django开发投票选举系统
这是一个基于 Python 3.11 和 Django 的全功能投票选举系统,提供用户认证、首页展示、投票功能、投票内容管理、数据统计与展示、用户管理和权限分配。系统支持第三方登录、搜索过滤、投票详情查看、选项选择及统计,并具有良好的扩展性和第三方系统集成能力。适用于各种选举场景,如学校选举、公司投票或在线调查。
6 0
|
2天前
|
存储 缓存 安全
Django的会话框架提供了一种简单且安全的方式来在用户与网站之间存储和检索状态信息
【5月更文挑战第12天】Django的会话管理依赖于内置的SessionMiddleware。要启用,需在settings.py的MIDDLEWARE中包含它,并确保&#39;django.contrib.sessions&#39;在INSTALLED_APPS内。设置SESSION_ENGINE可选择存储引擎,如默认的数据库或缓存。在视图中,通过request.session交互会话数据。模板可以直接访问这些数据。配置包括会话超时、cookie属性和存储后端。注意,敏感数据不宜存入会话,确保会话cookie安全,考虑使用缓存降低数据库压力。
8 3
|
17天前
|
安全 Python
102-Django开发学校教务管理系统源码+ER图
**Django学校教务管理系统**是使用Python的Django框架开发的,专注于学生和教师的互动。系统功能包括班级管理(教师添加和管理学生,学生查看信息)、分数管理(教师打分和更新,学生查看详情)、作业管理(上传、提交和批改)、师生通讯、发布公告以及用户配置。系统支持管理员、教师和学生的不同角色和权限,特点是互动性强、操作便捷且安全性高。通过这个系统,教学过程变得更加高效,有助于提升教学质量和学习效果。
25 4
|
1月前
|
安全 数据库 C++
Python Web框架比较:Django vs Flask vs Pyramid
【4月更文挑战第9天】本文对比了Python三大Web框架Django、Flask和Pyramid。Django功能全面,适合快速开发,但学习曲线较陡;Flask轻量灵活,易于入门,但默认配置简单,需自行添加功能;Pyramid兼顾灵活性和可扩展性,适合不同规模项目,但社区及资源相对较少。选择框架应考虑项目需求和开发者偏好。
|
6天前
|
前端开发 UED Python
Wagtail-基于Python Django的内容管理系统CMS实现公网访问
Wagtail-基于Python Django的内容管理系统CMS实现公网访问
|
6天前
|
中间件 Python
中间件应用Django Middleware(Python)
【5月更文挑战第3天】中间件应用Django Middleware(Python)
34 6
中间件应用Django Middleware(Python)
|
16天前
|
运维 监控 Serverless
Serverless 应用引擎产品使用之阿里函数计算中在自定义环境下用debian10运行django,用官方层的python3.9,配置好环境变量后发现自定义层的django找不到了如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
22 3
|
18天前
|
存储 搜索推荐 开发者
django-haystack,具有全文搜索功能的 Python 库!
django-haystack,具有全文搜索功能的 Python 库!
25 0