PyCharm + Django 学生管理系统开发教程
一、项目概述
本教程将指导您如何使用 PyCharm 和 Django 创建一个学生管理系统。学生管理系统是一个用于管理学生信息、课程信息、成绩等信息的系统。我们将从零开始,逐步完成项目的搭建、数据库设计、模型定义、视图和模板创建、表单验证以及最后的部署。
二、环境准备
1. 安装 PyCharm:访问 PyCharm 官网(https://www.jetbrains.com/pycharm/)下载并安装适合您操作系统的 PyCharm 版本。
2. 安装 Django:访问 Django 官网(https://www.djangoproject.com/)下载并安装适合您操作系统的 Django 版本。
3. 创建虚拟环境:在命令行中输入以下命令,创建一个新的虚拟环境:
```bash
python -m venv myenv
```
4. 激活虚拟环境:在命令行中输入以下命令,激活虚拟环境:
```bash
source myenv/bin/activate
```
5. 安装所需依赖:在虚拟环境中输入以下命令,安装所需的依赖包:
```bash
pip install django
```
三、项目结构
1. 创建一个新的 Django 项目:在命令行中输入以下命令,创建一个新的 Django 项目:
```bash
django-admin startproject student_management_system
```
2. 进入项目目录:在命令行中输入以下命令,进入项目目录:
```bash
cd student_management_system
```
四、数据库设计
1. 创建数据库:在命令行中输入以下命令,创建名为 `student` 的数据库:
```sql
python manage.py migrate
```
2. 创建表结构:在命令行中输入以下命令,创建 `student` 表的结构:
```sql
python manage.py makemigrations
python manage.py migrate
```
五、模型定义
1. 创建 `Student` 模型:在命令行中输入以下命令,创建 `Student` 模型:
```python
from django.db import models
class Student(models.Model):
name = models.CharField(max_length=100)
age = models.IntegerField()
email = models.EmailField(unique=True)
phone = models.CharField(max_length=15)
```
2. 创建 `Course` 模型:在命令行中输入以下命令,创建 `Course` 模型:
```python
from django.db import models
class Course(models.Model):
name = models.CharField(max_length=100)
teacher = models.CharField(max_length=100)
students = models.ManyToManyField(Student)
```
六、视图和模板创建
1. 创建 `student_list` 视图:在命令行中输入以下命令,创建 `student_list` 视图:
```python
from django.shortcuts import render
from .models import Student, Course
def student_list(request):
students = Student.objects.all()
return render(request, 'student_list.html', {'students': students})
```
2. 创建 `add_student` 视图:在命令行中输入以下命令,创建 `add_student` 视图:
```python
from django.shortcuts import render, redirect
from .models import Student, Course
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})
```
3. 创建 `edit_student` 视图:在命令行中输入以下命令,创建 `edit_student` 视图:
```python
from django.shortcuts import render, redirect
from .models import Student, Course
from .forms import StudentForm
def edit_student(request, student_id):
student = get_object_or_404(Student, id=student_id)
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})
```
4. 创建 `delete_student` 视图:在命令行中输入以下命令,创建 `delete_student` 视图:
```python
from django.shortcuts import render, redirect, get_object_or_404
from .models import Student, Course
from .forms import StudentForm
def delete_student(request, student_id):
student = get_object_or_404(Student, id=student_id)
if request.method == 'POST':
student.delete()
return redirect('student_list')
return render(request, 'delete_student.html', {'student': student})
```
5. 创建 `add_course` 视图:在命令行中输入以下命令,创建 `add_course` 视图:
```python
from django.shortcuts import render, redirect, get_object_or_404
from .models import Course, Student, CourseInstructor
from .forms import CourseForm, CourseInstructorForm
def add_course(request):
if request.method == 'POST':
form = CourseForm(request.POST)
if form.is_valid():
form.save()
course = form.save()
instructor = form.cleaned_data['instructor']
instructor = get_object_or_404(User, username=instructor)
course.instructors.add(instructor)
course.save()
return redirect('student_list')
else:
form = CourseForm()
return render(request, 'add_course.html', {'form': form})
```
6. 创建 `edit_course` 视图:在命令行中输入以下命令,创建 `edit_course` 视图:
```python
from django.shortcuts import render, redirect, get_object_or_404
from .models import Course, Student, CourseInstructor
from .forms import CourseForm, CourseInstructorForm
def edit_course(request, course_id):
course = get_object_or_404(Course, id=course_id)
if request.method == 'POST':
form = CourseForm(request.POST, instance=course)
if form.is_valid():
form.save()
course.update(course.name=form.cleaned_data['name'], course.teacher=form.cleaned_data['teacher'])
course.save()
return redirect('student_list')
else:
form = CourseForm()
return render(request, 'edit_course.html', {'course': course, 'form': form})
```
七、表单验证和提交处理
1. 创建 `StudentForm` 类:在命令行中输入以下命令,创建 `StudentForm` 类:
```python
from django import forms
from .models import Student, CourseInstructor
from .forms import CourseForm, CourseInstructorForm
class StudentForm(forms.ModelForm):
class Meta:
model = Student
fields = ['name', 'age', 'email', 'phone']
labels = {
'name': '姓名',
'age': '年龄',
'email': '邮箱',
'phone': '电话'
}
extra_fields = {"password": "密码"}
```
2. 创建 `CourseInstructorForm` 类:在命令行中输入以下命令,创建 `CourseInstructorForm` 类:
```python
from django import forms
from .models import User, CourseInstructor
from .forms import CourseForm, CourseInstructorForm
class CourseInstructorForm(forms.ModelForm):
class Meta:
model = User
fields = ['username']
labels = {"username": "用户名"} + [f"{k}: {v}" for k, v in self.fields.items()]
```
3. 创建表单验证逻辑:在命令行中输入以下命令,创建表单验证逻辑:
```python
from django import forms
from .models import Student, CourseInstructor, Course, StudentForm, CourseInstructorForm
from .forms import *
from django.core.exceptions import ValidationError
from django.contrib.auth.decorators import login_required
from django.contrib import messages
from django.urls import reverse_lazy
from django.utils import timezone
from django.utils.translation import gettext as _
import datetime
import pytz
import pytz.countrytimezones as countrytimezones
import pytz.timezone as timezones
import pytz.timezoneinfo as timezoneinfos
import pytz.tzlocal as locales
import pytz.tzoffset as offsets
import pytz.tzoffsets as offsetsssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSISSSESSSESS