小明:最近我在杭州的一家教育科技公司实习,他们需要一个学生工作管理系统。我应该怎么做呢?
李工:首先,你需要明确系统的核心功能。比如学生信息管理、课程安排、成绩记录、考勤统计等。然后选择合适的技术栈。
小明:那用什么技术比较好?我之前学过Python,有没有适合的框架?
李工:当然有!Python有很多优秀的Web框架,比如Django和Flask。Django是全栈框架,适合快速开发;而Flask更轻量,适合灵活定制。如果你是初学者,建议从Django开始。
小明:那我们就用Django吧。接下来我应该怎么搭建环境呢?
李工:你可以先安装Python,然后使用pip安装Django。具体步骤如下:
# 安装Python(假设你已经安装了)
# 使用pip安装Django
pip install django
小明:好的,那创建项目的话,命令是什么?
李工:运行以下命令即可创建一个新的Django项目:
django-admin startproject student_management
小明:然后进入项目目录,启动服务器吗?
李工:对的,进入项目目录后,运行:
cd student_management
python manage.py runserver
小明:这样就能看到默认页面了。接下来我需要设计数据库模型。
李工:没错,Django的ORM非常强大。你可以定义模型类,然后让Django帮你生成对应的数据库表。
小明:比如学生信息模型,应该包括哪些字段?
李工:通常包括姓名、学号、性别、出生日期、联系方式、所在班级等。你可以这样定义模型:
from django.db import models
class Student(models.Model):
name = models.CharField(max_length=100)
student_id = models.CharField(max_length=20, unique=True)
gender = models.CharField(max_length=10, choices=[('男', '男'), ('女', '女')])
birth_date = models.DateField()
phone = models.CharField(max_length=20)
class_name = models.CharField(max_length=50)
def __str__(self):
return self.name
小明:这个模型看起来很清晰。那怎么生成数据库呢?
李工:运行以下命令,Django会根据模型自动生成数据库表:
python manage.py makemigrations
python manage.py migrate
小明:现在数据表已经建好了。接下来我需要创建管理员界面,方便管理学生信息。
李工:可以使用Django Admin来管理数据。只需要注册模型到admin.py中即可:
from django.contrib import admin
from .models import Student
admin.site.register(Student)
小明:然后访问http://127.0.0.1:8000/admin,登录后就可以管理学生信息了。
李工:对的。不过这只是后台管理,前端还需要展示页面。
小明:那前端怎么处理?是不是需要写模板?
李工:是的,Django支持模板引擎。你可以创建templates文件夹,然后在其中编写HTML页面。
小明:比如显示所有学生信息的页面,该怎么写?
李工:可以在views.py中定义视图函数,然后渲染模板。例如:
from django.shortcuts import render
from .models import Student
def student_list(request):
students = Student.objects.all()
return render(request, 'student_list.html', {'students': students})
小明:然后在模板中循环显示学生信息。
李工:对的,比如在student_list.html中:
学生列表
学生列表
{% for student in students %}
- {{ student.name }} - {{ student.student_id }}
{% endfor %}
小明:这样就能显示学生信息了。那怎么添加新学生?
李工:可以创建一个表单页面,用户提交后保存到数据库。Django提供了Form和ModelForm来简化这一过程。
小明:那我应该怎么写表单?
李工:可以定义一个StudentForm,然后在视图中处理POST请求。例如:
from django import forms
from .models import Student
class StudentForm(forms.ModelForm):
class Meta:
model = Student
fields = ['name', 'student_id', 'gender', 'birth_date', 'phone', 'class_name']
小明:然后在视图中处理表单提交。
李工:是的,示例代码如下:
def add_student(request):
if request.method == 'POST':
form = StudentForm(request.POST)
if form.is_valid():
form.save()
return redirect('student_list')
else:
form = StudentForm()
return render(request, 'add_student.html', {'form': form})
小明:然后在模板中显示表单。
李工:是的,例如在add_student.html中:
小明:这样就完成了添加学生的功能。
李工:接下来你可以考虑增加更多功能,比如搜索、分页、导出Excel等。
小明:那如何实现搜索功能?
李工:可以通过在视图中根据查询参数过滤学生数据。例如:
def student_search(request):
query = request.GET.get('q')
if query:
students = Student.objects.filter(name__icontains=query)
else:
students = Student.objects.all()
return render(request, 'student_search.html', {'students': students, 'query': query})
小明:这样就能根据姓名进行模糊搜索了。
李工:对的。另外,为了提高用户体验,还可以加入分页功能。
小明:那分页怎么实现?
李工:Django内置了Paginator类,可以轻松实现分页。例如:
from django.core.paginator import Paginator
def student_list(request):
students = Student.objects.all()
paginator = Paginator(students, 10) # 每页显示10条
page_number = request.GET.get('page')
page_obj = paginator.get_page(page_number)
return render(request, 'student_list.html', {'page_obj': page_obj})
小明:然后在模板中显示分页控件。
李工:是的,例如在student_list.html中:
小明:这真是个实用的功能。
李工:接下来,你可以考虑集成一些高级功能,比如权限控制、日志记录、API接口等。
小明:那权限控制怎么实现?
李工:可以用Django的内置认证系统,或者自己定义权限逻辑。例如,只有管理员才能修改学生信息。
小明:那如何设置管理员权限?
李工:可以通过在视图中判断用户是否为管理员。例如:
from django.contrib.auth.decorators import login_required, permission_required
@login_required
@permission_required('student_management.can_edit_student', raise_exception=True)
def edit_student(request, pk):
student = Student.objects.get(pk=pk)
if request.method == 'POST':
form = StudentForm(request.POST, instance=student)
if form.is_valid():
form.save()
return redirect('student_list')
else:
form = StudentForm(instance=student)
return render(request, 'edit_student.html', {'form': form})
小明:这样就能限制只有特定权限的用户才能编辑学生信息。
李工:是的。最后,你可能还需要将系统部署到服务器上,比如使用Docker或云平台。
小明:那部署的具体步骤是什么?

李工:可以使用Gunicorn作为生产服务器,Nginx作为反向代理。也可以使用Docker容器化部署,更加方便。
小明:好的,我会继续学习这些内容。
李工:加油!你已经在正确道路上了。如果有任何问题,随时来找我。
