主要功能
登录、注册、主页显示个人信息、成绩查询
pycharm社区版创建django项目
第一步
第二步
打开cmd
进入到你想要创建的项目的目录下(……pythonProject3>
django-admin startproject mysite
创建app
在pycharm终端进入mysite目录(包含manage.py的目录
python manage.py startapp login
设置时区、语言
settings文件中修改
# Internationalization
# https://docs.djangoproject.com/en/1.11/topics/i18n/
LANGUAGE_CODE = 'zh-hans' # 这里修改了
TIME_ZONE = 'Asia/Shanghai' # 这里修改了
USE_I18N = True
USE_L10N = True
USE_TZ = False # 这里修改了
数据库模型设计
学生登录:
- 学号
- 名字
- 密码
学生信息:
- 学号
- 名字
- 电话
- 地址
- 学院
- 专业
课程成绩:
- 学号
- 课程
- 成绩
进入models文件
from django.db import models
# Create your models here.
# 课程成绩表
class CourseModel(models.Model):
cour_id = models.CharField(max_length=15, verbose_name='学生ID')
course = models.CharField(max_length=30, verbose_name='课程')
grade = models.IntegerField(default=60, verbose_name='分数')
class Meta():
db_table = 'course'
def __str__(self):
return '学生Id: 课程: 分数: '.format(self.cour_id, self.course, self.grade)
# 学生信息表
class StudentInformationModel(models.Model):
stu_id = models.CharField(max_length=15,verbose_name='学生id')
stu_name = models.CharField(max_length=30, verbose_name='学生姓名')
stu_phone = models.CharField(max_length=20, verbose_name='学生电话')
str_addr = models.TextField(verbose_name='学生地址')
stu_faculty = models.CharField(max_length=20, verbose_name='院系')
stu_major = models.CharField(max_length=30, verbose_name='专业')
class Meta():
db_table = 'studentinformation'
# 学生登录表
class StudentModel(models.Model):
stu_id = models.AutoField(primary_key=True)
username = models.CharField(max_length=10, verbose_name='用户名')
password = models.CharField(max_length=10, verbose_name='密码')
class Meta():
db_table = 'student'
- verbose_name就是在后台显示对对应的名称
- class Meta 定义模型的元数据(eg:数据库表名(db_table)
- def __str__(self):使用
__str__
方法帮助人性化显示对象信息 - AutoField(primary_key=True):新建一个主键
拓:
class Meta:
ordering = ["-c_time"]
定义用户按创建时间的反序排列,也就是最近的最先显示;
name = models.CharField(max_length=128, unique=True)
unique:用户名唯一(若为人名则不用unique:True)
设置数据库后端
settings文件中默认使用SQLite数据库,不需修改(或修改下名字
注册app
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'login', # 添加models所在的文件夹名
]
创建记录和数据表
pycharm终端输入
python manage.py makemigrations
python manage.py migrate
在admin中注册模型
from django.contrib import admin # 导入admin模块
from login.models import StudentInformationModel, CourseModel, StudentModel # 导入模型模块
# 自定义类:控制后台内容管理页面显示等
class StudentInformationLine(admin.TabularInline):
model = CourseModel
extra = 3
class StudentInformationAdmin(admin.ModelAdmin):
# 显示的字段,先后顺序表示显示顺序
list_display = ['stu_id', 'stu_name', 'stu_phone', 'str_addr', 'stu_faculty', 'stu_major']
# 以哪个来过滤
list_filter = ['stu_id', 'stu_name']
# 以哪个字段来搜索,admin中就会出现一个搜索栏
search_fields = ['stu_name', 'str_addr', 'stu_faculty', 'stu_major']
list_per_page = 5
class CourseAdmin(admin.ModelAdmin):
list_display = ['cour_id', 'course', 'grade']
# inlines = [StudentInformationLine, ] # 谁的外键就写在哪边
class StudentAdmin(admin.ModelAdmin):
list_display = ['stu_id', 'username', 'password']
search_fields = ['stu_id', 'username']
actions_on_top = False
actions_on_bottom = True
# 注册模型 加以上自定义类为参数
admin.site.register(StudentInformationModel, StudentInformationAdmin)
admin.site.register(CourseModel, CourseAdmin)
admin.site.register(StudentModel, StudentAdmin)
创建超级管理员
终端
python manage.py createsuperuser
用户名、邮箱和密码自行设定
然后可以用admin后台或navicat
路由设计
from django.contrib import admin
from django.urls import path
from django.urls import include
from login import views
urlpatterns = [
path('admin/', admin.site.urls),
path('index/', views.index),
path('login/', views.login),
path('logout/', views.logout),
path('register/', views.register),
# path('captcha/', include('captcha.urls')) # 验证码
]
views及html
进入views
from django.shortcuts import render, HttpResponse, redirect, reverse
from .models import StudentModel, StudentInformationModel, CourseModel
from django.forms.models import model_to_dict
# Create your views here.
import json
# 主界面
def index(request):
context = {
'status': '未登录状态'
}
# 'msg': True
return render(request, 'login/index.html', context)
# 登录界面
def login(request):
if request.method == "POST":
username = request.POST.get('username')
password = request.POST.get('password')
if not all([username, password]):
return HttpResponse('错误!用户名或密码为空!')
else:
student = StudentModel.objects.filter(username=username, password=password)
if len(student):
# 将用户的信息存放到session中,session在中间件中是默认启用的
# request.session['user_id'] = student[0].stu_id
request.session['user'] = {
'id': student[0].stu_id,
'username': username,
'password': password
}
# 开始了
id = student[0].stu_id
# if id == '':
# id = request.session['user']['id']
try:
stu_data = StudentInformationModel.objects.get(pk=id)
except:
context = {
'error': "not found studnet id: " + str(id),
}
return render(request, 'login/index.html', context)
stu_course = CourseModel.objects.filter(cour_id=id)
dct = {}
for stu in stu_course:
dct[stu.course] = stu.grade
context = {
'stu_id': id,
'stu_name': stu_data.stu_name,
'stu_phone': stu_data.stu_phone,
'str_addr': stu_data.str_addr,
'stu_faculty': stu_data.stu_faculty,
'stu_major': stu_data.stu_major,
'course_data': dct,
'status': username,
'msg': '已登录',
'lenght': 1
}
return render(request, 'login/index.html', context)
else:
context = {
'msg': '用户名密码错误'
}
return render(request, 'login/login.html', context)
else:
context = {
'status': '未登录状态',
'length': 0
}
return render(request, 'login/login.html', context)
# 注册界面
def register(request):
if request.method == "POST":
username = request.POST.get("username")
password = request.POST.get("password")
verif_password = request.POST.get("verif_password")
student = StudentModel.objects.filter(username=username)
# 注册验证错误信息汇总
error_message = ""
if not all([username, password, verif_password]):
error_message += "注册信息不能为空;\n"
if student:
error_message += "该用户名已存在;\n"
if password != verif_password:
error_message += "两次密码输入不一致;\n"
# 如果存在注册信息则重定向到注册页面
if error_message:
context = {
"error": error_message
}
return render(request, 'login/register.html', context)
# 注册信息有效,注册成功
stu_data = StudentModel()
stu_data.username = username
stu_data.password = password
stu_data.save()
context = {
'sucess': '增加成功',
}
return render(request, 'login/login.html', context)
else:
return render(request, 'login/register.html')
# 退出界面
def logout(request):
# 注销掉用户,从删除session中保存的信息
del request.session['user']
return render(request, 'login/index.html')