小明:最近我在厦门的一家科技公司实习,公司需要一个学生实习管理系统来管理实习生的信息和实习进度。我该怎么开始呢?
小李:你有做过类似的项目吗?或者有没有接触过Web开发?
小明:我学过一点Python,但对Web开发不太熟悉。
小李:那我们可以从头开始,用Django框架来搭建这个系统。Django是一个功能强大的Python Web框架,适合快速开发。
小明:听起来不错,那我们需要哪些工具呢?
小李:首先,你需要安装Python环境,然后安装Django。你可以用pip来安装Django,命令是:

pip install django
小明:明白了。那接下来呢?
小李:创建一个Django项目,然后创建一个应用。比如,我们叫它“internship”。命令如下:
django-admin startproject internship_system
cd internship_system
python manage.py startapp internship
小明:好的,那接下来怎么配置数据库呢?
小李:默认情况下,Django使用SQLite,但如果你想要更稳定的数据库,可以换成MySQL或PostgreSQL。不过先用SQLite试试看吧。
小明:那数据库模型怎么设计呢?
小李:我们先定义几个核心模型,比如学生、实习单位、实习记录等。在internship/models.py中添加如下代码:
from django.db import models
class Student(models.Model):
name = models.CharField(max_length=100)
student_id = models.CharField(max_length=20, unique=True)
major = models.CharField(max_length=100)
email = models.EmailField()
def __str__(self):
return self.name
class Company(models.Model):
name = models.CharField(max_length=100)
address = models.TextField()
contact_person = models.CharField(max_length=100)
phone = models.CharField(max_length=20)
def __str__(self):
return self.name
class InternshipRecord(models.Model):
student = models.ForeignKey(Student, on_delete=models.CASCADE)
company = models.ForeignKey(Company, on_delete=models.CASCADE)
start_date = models.DateField()
end_date = models.DateField()
status = models.CharField(max_length=50, choices=[
('Pending', 'Pending'),
('Approved', 'Approved'),
('Completed', 'Completed'),
('Rejected', 'Rejected')
])
def __str__(self):
return f"{self.student.name} - {self.company.name}"
小明:这些模型看起来很合理。那怎么把这些模型同步到数据库里呢?
小李:运行以下命令生成迁移文件并应用到数据库:
python manage.py makemigrations
python manage.py migrate
小明:这样就完成了数据库的初始化吗?
小李:是的,现在数据库已经创建好了。接下来我们创建一个简单的界面,让用户可以添加学生、公司和实习记录。
小明:那怎么创建视图和模板呢?
小李:我们可以使用Django的视图和模板系统。在internship/views.py中写一些基本的视图函数,例如:
from django.shortcuts import render, redirect
from .models import Student, Company, InternshipRecord
from .forms import StudentForm, CompanyForm, InternshipForm
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})
def student_list(request):
students = Student.objects.all()
return render(request, 'student_list.html', {'students': students})
小明:那表单是怎么定义的呢?
小李:我们可以在internship/forms.py中定义表单类,例如:
from django import forms
from .models import Student, Company, InternshipRecord
class StudentForm(forms.ModelForm):
class Meta:
model = Student
fields = ['name', 'student_id', 'major', 'email']
class CompanyForm(forms.ModelForm):
class Meta:
model = Company
fields = ['name', 'address', 'contact_person', 'phone']
class InternshipForm(forms.ModelForm):
class Meta:
model = InternshipRecord
fields = ['student', 'company', 'start_date', 'end_date', 'status']
小明:这样就可以通过表单来添加数据了。那模板怎么写呢?
小李:在templates目录下创建对应的HTML模板,比如add_student.html,内容如下:
<html>
<head><title>Add Student</title></head>
<body>
<h1>Add New Student</h1>
<form method="post">
{{ form.as_p }}
<button type="submit">Submit</button>
</form>
</body>
</html>
小明:那怎么把视图和URL关联起来呢?
小李:在internship/urls.py中定义路由,然后在主项目的urls.py中引入。例如,在internship/urls.py中写:
from django.urls import path
from . import views
urlpatterns = [
path('add-student/', views.add_student, name='add_student'),
path('student-list/', views.student_list, name='student_list'),
]
小明:然后在main urls.py中加入:
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('internship.urls')),
]
小明:这样就可以访问页面了。
小李:没错。现在你可以通过浏览器访问 http://127.0.0.1:8000/add-student/ 来添加学生信息。
小明:那如果我要展示所有学生信息呢?
小李:我们已经在views.py中写了student_list函数,只需要创建对应的模板文件student_list.html,内容如下:
<html>
<head><title>Student List</title></head>
<body>
<h1>Student List</h1>
<ul>
{% for student in students %}
<li>{{ student.name }} ({{ student.student_id }})</li>
{% endfor %}
</ul>
</body>
</html>
小明:这太棒了!那如果我要扩展功能,比如按公司查询实习记录呢?
小李:我们可以添加一个搜索功能。在views.py中添加一个search_internship函数,根据公司名称进行过滤,并在模板中添加一个搜索表单。
小明:看来这个系统还有很多可以优化的地方。
小李:是的,比如可以添加用户登录系统、权限管理、数据导出等功能。如果你有兴趣,我们还可以继续扩展。
小明:谢谢你的帮助,我现在对这个系统有了更深的理解。
小李:不客气!希望你在厦门的实习顺利,也祝你的项目成功。
