小明:你好,李老师,我最近在做一个学生宿舍管理系统,想看看能不能用试用版来测试一下功能。
李老师:哦,你是在做毕业设计吗?那挺好的。试用版的话,可以先从基础模块开始,比如学生信息管理、宿舍分配和费用记录。
小明:对的,我之前用Python和Django框架搭建了一个原型系统,现在想看看能否扩展成一个完整的管理系统。
李老师:那你可以先考虑使用一个轻量级的数据库,比如SQLite或者MySQL,这样方便后续部署。
小明:不过我对数据库设计不太熟悉,你能教我怎么设计表结构吗?
李老师:当然可以。首先,你需要设计几个核心表,比如学生表、宿舍表、管理员表,以及入住记录表。
小明:那具体怎么设计呢?
李老师:比如说学生表,应该包含学号、姓名、性别、专业、联系方式等字段;宿舍表包括宿舍编号、楼栋、房间类型、床位数等。
小明:明白了。那数据库连接部分该怎么写呢?
李老师:在Django中,你只需要在settings.py里配置DATABASES即可。比如设置ENGINE为'django.db.backends.mysql',然后填写主机、用户名、密码和数据库名。
小明:那我是不是还需要创建模型类?
李老师:是的。每个表对应一个模型类,例如StudentModel,里面定义字段和关系。
小明:那我可以写一个简单的模型示例吗?
李老师:当然可以,我给你看一下:
from django.db import models
class Student(models.Model):
student_id = models.CharField(max_length=20, unique=True)
name = models.CharField(max_length=100)
gender = models.CharField(max_length=10)
major = models.CharField(max_length=100)
phone = models.CharField(max_length=20)
class Dormitory(models.Model):
dorm_id = models.CharField(max_length=20, unique=True)
building = models.CharField(max_length=50)
room_type = models.CharField(max_length=50)
bed_count = models.IntegerField()
class Allocation(models.Model):
student = models.ForeignKey(Student, on_delete=models.CASCADE)
dormitory = models.ForeignKey(Dormitory, on_delete=models.CASCADE)
date_allocated = models.DateField()
status = models.CharField(max_length=20)
小明:这个模型看起来很清晰,那接下来我应该怎么处理前端页面呢?
李老师:你可以使用HTML、CSS和JavaScript来构建前端页面,也可以使用Django的模板引擎来动态生成页面内容。
小明:那如果我要实现一个学生信息展示页面,该怎么写模板呢?
李老师:你可以在templates目录下创建一个student_list.html文件,然后用Django模板语言来循环显示数据。
小明:能给我举个例子吗?
李老师:当然,下面是一个简单的例子:
学生信息列表
学生信息列表
{% for student in students %}
- {{ student.name }} - {{ student.student_id }}
{% endfor %}
小明:明白了,那如何把数据传到前端呢?
李老师:你需要在视图函数中查询数据,并将它们传递给模板。例如:
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})
小明:这样的话,前端就能看到数据了。那接下来我想添加一个添加学生的功能,该怎么实现?
李老师:你可以创建一个表单,让用户输入学生信息,然后在视图中处理POST请求,保存到数据库。
小明:那表单该怎么写呢?
李老师:可以用Django的Form类来简化表单验证。例如:
from django import forms
from .models import Student
class StudentForm(forms.ModelForm):
class Meta:
model = Student
fields = ['student_id', 'name', 'gender', 'major', 'phone']
小明:那视图函数怎么处理表单提交呢?
李老师:你可以这样写:
from django.shortcuts import render, redirect
from .forms import StudentForm
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文件,内容如下:
添加学生
添加学生
小明:这样就完成了添加功能。那如果我想实现宿舍分配的功能呢?
李老师:宿舍分配涉及到两个表之间的关联,你需要在视图中处理学生和宿舍的选择,然后保存到Allocation模型中。
小明:那我可以先在前端页面中选择学生和宿舍,然后提交数据吗?
李老师:是的,你可以用下拉框或搜索框来选择学生和宿舍,然后在后端处理这些数据。
小明:那代码应该怎么写呢?
李老师:这里是一个简单的示例:
from django.shortcuts import render, redirect
from .models import Student, Dormitory, Allocation
from .forms import AllocationForm
def allocate_dorm(request):
if request.method == 'POST':
form = AllocationForm(request.POST)
if form.is_valid():
form.save()
return redirect('allocation_list')
else:
form = AllocationForm()
return render(request, 'allocate_dorm.html', {'form': form})
小明:那AllocationForm该怎么定义呢?
李老师:你可以像之前那样,用ModelForm来生成表单,例如:
from django import forms
from .models import Allocation
class AllocationForm(forms.ModelForm):
class Meta:
model = Allocation
fields = ['student', 'dormitory', 'date_allocated', 'status']
小明:这样就可以让前端用户选择学生和宿舍了。那数据库中的外键关系是怎么处理的呢?
李老师:Django会自动处理外键关系,只要你在模型中正确设置了ForeignKey字段,表单就会显示相关联的数据。
小明:明白了。那我现在已经实现了学生信息管理和宿舍分配的基本功能,接下来我应该怎么做呢?
李老师:你可以继续添加其他功能,比如学生退宿、费用管理、宿舍维修申请等。
小明:那费用管理该怎么设计呢?
李老师:你可以创建一个Fee模型,包含学生ID、费用类型、金额、缴纳状态等字段,然后在视图中进行处理。
小明:听起来不错。那我是不是还需要一个登录系统来限制访问权限?
李老师:是的,你可以使用Django内置的认证系统,或者自己实现一个简单的登录逻辑。
小明:那我可以先尝试使用Django的认证系统吗?
李老师:当然可以。Django提供了User模型,你可以直接使用,也可以自定义用户模型。
小明:那如何实现管理员和普通用户的权限区分呢?
李老师:你可以通过检查用户是否是管理员来控制权限,例如在视图中判断user.is_staff。
小明:那如果我要实现一个管理员界面,该怎么设计呢?
李老师:你可以创建一个后台管理页面,利用Django Admin,或者自己编写一个管理界面。
小明:Django Admin真的很好用,我之前用过一次,感觉很直观。
李老师:没错,Django Admin可以快速搭建一个管理界面,节省很多时间。
小明:那我现在已经有一个基本的学生宿舍管理系统了,接下来我可以试试看试用版的功能。
李老师:试用版的话,建议你先部署到本地服务器上测试,确保功能正常后再考虑上线。
小明:好的,谢谢李老师的指导,我这就去测试一下我的系统。
李老师:不客气,有问题随时来问我。
