目錄:
1.需求
1.登錄注冊
- 編寫用戶注冊功能(用戶名、密碼、確認密碼)
- 提供登錄功能
- 登陸后可以填寫個人信息(昵稱、年齡、頭像)
2.功能
- 第一個注冊用戶為管理員,管理員還可以創(chuàng)建、修改、刪除課程分類信息,比如(計算機、文學(xué)、化學(xué))
- 管理員可以創(chuàng)建課程(每一門課程只能屬于一個課程分類)、修改課程、刪除課程、查看選擇某一門學(xué)科的所有學(xué)生列表、查看某一分類的所有學(xué)科。
- 所有用戶都可以查看課程列表,并將課程加到自己的已選課程列表中;所有用戶可以查看自己選擇的課程列表、查看課程詳細介紹、從自己的課程列表中刪除某一門課程
2.代碼操作
(前端小白,所以沒有加入樣式QAQ)

lesson樹形圖
- lessonform.py
#-*- coding:utf-8 -*-
from django.forms import Form,fields,widgets,ValidationError
from lesson import models
class register(Form):
userName = fields.CharField(max_length=10)
password = fields.CharField(max_length=10,widget=widgets.PasswordInput)
repassword = fields.CharField(max_length=10,widget=widgets.PasswordInput)
def clean(self):
password = self.cleaned_data['password']
repassword = self.cleaned_data['repassword']
if not password == repassword:
myerror = '兩次密碼不一致,請重新輸入'
raise ValidationError(myerror)
return self.cleaned_data
class login(Form):
userName = fields.CharField(max_length=10)
password = fields.CharField(max_length=10,widget=widgets.PasswordInput)
class UserInfoForm(Form):
age = fields.IntegerField()
email = fields.EmailField(max_length=20)
class TypeForm(Form):
typeName = fields.CharField(max_length=20)
class LessonForm(Form):
lessonName = fields.CharField(max_length=20)
typeName = fields.ChoiceField()
def __init__(self,*args,**kwargs):
super(LessonForm, self).__init__(*args,**kwargs)
items = models.LessonType.objects.values_list('id','typeName')
self.fields['typeName'].choices=(x for x in items )
- models.py
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models
# Create your models here.
class User(models.Model):
userName = models.CharField(max_length=10)
password = models.CharField(max_length=10)
class UserInfo(models.Model):
user = models.OneToOneField('User')
age = models.IntegerField()
email = models.EmailField()
class LessonType(models.Model):
typeName = models.CharField(max_length=20)
class Lesson(models.Model):
lessonName = models.CharField(max_length=20)
type = models.ForeignKey('LessonType')
selectedUser = models.ManyToManyField('User')
- html
- login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登錄</title>
</head>
<body>
<form action="{{request.path}}" method="POST">
{% csrf_token %}
<a href="{% url 'lessonregister' %}">沒有賬號?去注冊</a><br>
用戶名:{{loginform.userName}}<br>
密 碼:{{loginform.password}}<br>{{error}}<br>
<input type="submit" value="登錄">
</form>
<a href="{% url 'lessonlogout' %}">注銷</a>
<a href="{% url 'addtype' %}">增加課程分類</a>
</body>
</html>
- html
- register.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>注冊頁面</title>
</head>
<body>
<form action="" method="post">
{% csrf_token %}
用戶名:{{form.userName}}{{error}}<br>
密 碼:{{form.password}}<br>
確認密碼:{{form.repassword}}<br>{{form.non_field_errors}}<br>
<input type="submit" value="注冊">
<a href="{% url 'lessonlogin' %}">已有賬號,去登錄</a>
</form>
</body>
</html>
- html
- registersuc.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登錄成功</title>
</head>
<body>
登錄成功
<a href="{% url 'complete' %}">完善信息</a>
<a href="{% url 'addtype' %}">添加課程類型</a>
<a href="{% url 'addlesson' %}">添加課程</a>
<a href="{% url 'showseleteles' %}">顯示已選課程</a>
<a href="{% url 'cancelseleteles' %}">取消所選課程</a>
</body>
</html>
- html
- addtype.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>添加課程分類</title>
</head>
<body>
<form action="" method="POST">
{% csrf_token %}
課程類型名稱:{{ form.typeName }}<br>
<input type="submit" value="添加">
</form>
</body>
</html>
-
html
- addlesson.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>添加課程</title>
</head>
<body>
<form action="" method="POST">
{% csrf_token %}
課程名字:{{ form.lessonName }}<br>
課程分組:{{ form.typeName }}<br>
<input type="submit" value="確認添加">
</form>
</body>
</html>
-
html
- complete.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>完善個人信息</title>
</head>
<body>
<form action="" method="POST">
{% csrf_token %}
年齡:{{ form.age }}<br>
郵箱:{{ form.email }}<br>
<input type="submit" value="提交">
</form>
</body>
</html>
-
html
- mylesson.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>顯示課程列表</title>
</head>
<body>
{% for item in list %}
{{ item.lessonName}}<a href="{% url 'cancelseleteles' %}?lessonid={{item.id}}">取消選修</a><br>
{% endfor %}
</body>
</html>
-
html
- show_lesson.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>顯示課程列表</title>
</head>
<body>
{% for item in list %}
<a href="{% url 'showstudents' %}?lessonid={{item.id}}">{{ item.lessonName}}</a> <a href="{% url 'selectlesson' %}?lessonid={{item.id}}">選修此課程</a><br>
{% endfor %}
</body>
</html>
- html
- nav.html(導(dǎo)航欄)
<nav class="navbar navbar-default">
<div class="container-fluid">
<!-- Brand and toggle get grouped for better mobile display -->
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="#">選課系統(tǒng)</a>
</div>
<!-- Collect the nav links, forms, and other content for toggling -->
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
<ul class="nav navbar-nav">
<li class="active"><a href="{% url 'index' %}">首頁 <span class="sr-only">(current)</span></a></li>
<li><a href="{% url 'showlessontype' %}">選課</a></li>
<li><a href="{% url 'showseleteles' %}">我的課程</a></li>
</ul>
<form class="navbar-form navbar-left">
<div class="form-group">
<input type="text" class="form-control" placeholder="請輸入關(guān)鍵詞">
</div>
<button type="submit" class="btn btn-default">搜搜</button>
</form>
{% if not request.session.userid %}
<ul class="nav navbar-nav navbar-right">
<li><a class="btn btn-link" data-toggle="modal" href="{% url 'lessonlogin' %}">登錄</a></li>
<li><a class="btn btn-link" data-toggle="modal" href="{% url 'lessonregister'%}">注冊 </a> </li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">管理 <span class="caret"></span></a>
<ul class="dropdown-menu" >
<li><a href="{% url 'addtype' %}">課程分類管理</a></li>
<li><a href="{% url 'addlesson' %}">課程管理</a></li>
</ul>
</li>
</ul>
{% endif %}
{% if request.session.userid %}
<ul class="nav navbar-nav navbar-right">
<li><a class="btn btn-link" data-toggle="modal" href="{% url 'lessonlogout' %}">注銷 </a> </li>
<li><a class="btn" data-toggle="modal" href="{% url 'complete' %}">我的資料</a> </li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">管理 <span class="caret"></span></a>
<ul class="dropdown-menu" >
<li><a href="{% url 'addtype' %}">課程分類管理</a></li>
<li><a href="{% url 'addlesson' %}">課程管理</a></li>
<li><a class="btn btn-link" data-toggle="modal" href="{% url 'lessonlogin' %}">登錄</a></li>
<li><a class="btn btn-link" data-toggle="modal" href="{% url 'lessonregister'%}">注冊 </a> </li>
</ul>
</li>
</ul>
{% endif %}
</div><!-- /.navbar-collapse -->
</div><!-- /.container-fluid -->
</nav>
-
html
- showstudents.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>顯示課程的學(xué)生</title>
</head>
<body>
{% for item in list %}
{{ item.userName }}
<br>
{% endfor %}
</body>
</html>
- 項目下的
url.py
# -*- coding:utf-8 -*-
from django.conf.urls import url
from . import views
urlpatterns=[
url(r'^register/$',views.register,name='lessonregister'),
url(r'^login/$',views.login,name='lessonlogin'),
url(r'^logout/$',views.logout,name='lessonlogout'),
url(r'^addtype/$',views.addLessonType,name='addtype'), #增加課程類型
url(r'^complete/$',views.completeInfo,name='complete'), #完善信息
url(r'^addlesson/$',views.addLesson,name='addlesson'), #增加課程
url(r'^listlesson/(\d+)/$',views.listlesson,name='listlesson'), #顯示每個課程類型下的學(xué)科
url(r'^selectlesson/$',views.selectLesson,name='selectlesson'), #選課
url(r'^showseleteles/$', views.showSelectedLessons, name='showseleteles'), #顯示用戶已經(jīng)選的課程
url(r'^cancelseleteles/$',views.cancelSelectedLessons,name='cancelseleteles'), #取消所選課程
url(r'^showstudents/$',views.showStudents,name='showstudents'), #顯示每一門學(xué)科的學(xué)生
]
- views.py
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.shortcuts import render,redirect
from lesson.forms import lessonform
from lesson import models
from django.http import HttpResponse
from django.core.urlresolvers import reverse
# Create your views here.
def register(request):
if request.method == 'GET':
form = lessonform.register()
return render(request,'lesson/register.html',{'form':form})
elif request.method == 'POST':
form = lessonform.register(request.POST)
if form.is_valid():
temp = models.User.objects.filter(userName=form.cleaned_data['userName']).exists()
if temp == False:
user = models.User.objects.create(userName=form.cleaned_data['userName'],password=form.cleaned_data['password'])
request.session['userid']=str(user.id)
return HttpResponse('恭喜你注冊成功,用戶ID:' + request.session['userid'])
else:
error = '用戶名已經(jīng)存在,請換一個用戶名試試!'
return render(request,'lesson/register.html',{'form':form,'error':error})
else:
return render(request,'lesson/register.html',{'form':form})
#登錄功能
def login(request):
if request.method == 'GET':
loginform = lessonform.login()
return render(request,'lesson/login.html',{'loginform':loginform})
elif request.method == 'POST':
loginform = lessonform.login(request.POST,)
if loginform.is_valid():
userName = loginform.cleaned_data['userName']
password = loginform.cleaned_data['password']
user = models.User.objects.filter(userName=userName).filter(password=password)
if user.exists():
request.session['userid'] = user[0].id
print request.session['userid']
return render(request,'lesson/loginsuc.html',{'loginform':loginform})
else:
error = '用戶名或者密碼輸入有誤,請重試'
return render(request,'lesson/login.html',{'loginform':loginform,'error':error})
else:
return render(request,'lesson/login.html',{'loginform':loginform})
else:
return render(request, 'lesson/login.html')
#驗證用戶是否登錄
def checkLogin(session):
#session 鍵userid如果不存在對應(yīng)的值
id = session.get('userid',None)
if id==None:
#轉(zhuǎn)到登錄頁面
return False,redirect(reverse('lessonlogin'))
else:
return True,id
#注銷功能
def logout(request):
userId = request.session.get('userid',None)
if not userId == None:
del request.session['userid']
return HttpResponse('注銷成功')
else:
return HttpResponse('您還沒有登錄')
#添加課程類型
def addLessonType(request):
#先判斷是否登錄
isLogin,next = checkLogin(request.session)
#登錄后session中userid
if not isLogin:
return next
else:
#判斷是否為第一個用戶(默認第一個用戶為超級管理員)
if next==1:
if request.method == 'GET':
#生成表單
form = lessonform.TypeForm()
return render(request,'lesson/addtype.html',{'form':form})
elif request.method == 'POST':
form = lessonform.TypeForm(request.POST)
if form.is_valid():
#處理表單信息
type = models.LessonType()
type.typeName = form.cleaned_data['typeName']
if not models.LessonType.objects.filter(typeName=type.typeName):
type.save()
return HttpResponse('添加成功')
else:
error='此類型已存在'
return render(request,'lesson/addtype.html',{'form':form,'error':error})
else:
return render(request,'lesson/addtype.html',{'form':form})
else:
return HttpResponse('抱歉,你沒有此類權(quán)限!')
#完善信息
def completeInfo(request):
#先判斷是否登錄
isLogin,next = checkLogin(request.session)
# 登錄后session中userid
if not isLogin:
return next
else:
if request.method == 'GET':
infoForm = lessonform.UserInfoForm()
return render(request,'lesson/complete.html',{'form':infoForm})
elif request.method == 'POST':
infoForm = lessonform.UserInfoForm(request.POST)
if infoForm.is_valid():
user = models.User.objects.get(id=request.session['userid'])
email = infoForm.cleaned_data['email']
age = infoForm.cleaned_data['age']
models.UserInfo.objects.create(user=user,age=age,email=email)
return HttpResponse('信息已經(jīng)完善,你可以進行下一步操作了')
else:
return render(request,'lesson/complete.html',{'form':infoForm})
#添加課程
def addLesson(request):
#驗證是否登錄
isLogin,next = checkLogin(request.session)
if not isLogin:
return next
else:
#判斷是否為超級管理員
if next==1:
if request.method == 'GET':
#生成表單
form = lessonform.LessonForm()
#初始化選項列表,從數(shù)據(jù)庫中查找
items = models.LessonType.objects.values_list('id','typeName')
form.fields['typeName'].choices = (x for x in items)
return render(request,'lesson/addlesson.html',{'form':form})
elif request.method == 'POST':
form = lessonform.LessonForm(request.POST)
if form.is_valid():
#處理表單信息
lessonName = form.cleaned_data['lessonName']
id = form.cleaned_data['typeName']
#查找母表中的數(shù)據(jù)
lesson_type = models.LessonType.objects.get(id=id)
lesson = models.Lesson()
lesson.lessonName = lessonName
lesson.type = lesson_type
if not models.Lesson.objects.filter(lessonName=lessonName):
lesson.save()
return HttpResponse('添加成功')
else:
error = '課程已存在'
return render(request,'lesson/addlesson.html',{'form':form,'error':error})
else:
items = models.LessonType.objects.values_list('id','typeName')
form.fields['typeName'].choices=(x for x in items)
return render(request,'lesson/addlesson.html',{'form':form})
else:
return HttpResponse('你沒有操作的權(quán)限!')
# 修改課程所屬分類
def editlessontype(request):
#驗證是否登錄
isLogin,next = checkLogin(request.session)
if not isLogin:
#轉(zhuǎn)到登錄頁面
return next
else:
if next == 1:
if request.method == 'GET':
id = request.GET['id']
obj = models.LessonType.objects.get(id=id)
form = lessonform.TypeForm(initial={
'type': obj.lessiontype
})
return render(request, 'eeditTyp.html', {'form': form, 'id': id})
elif request.method == 'POST':
form = lessonform.TypeForm(request.POST)
if form.is_valid():
data = form.cleaned_data
id = request.GET['id']
type = models.LessonType.objects.get(id=id)
type.lessiontype = data['type']
if not models.LessonType.objects.filter(lessiontype=type.lessiontype):
type.save()
return redirect(reverse('addType'))
else:
error = '課程類型已存在'
return render(request, 'edittype.html', {'form': form, 'error': error})
else:
return render(request, 'edittype.html', {'form': form})
else:
return HttpResponse('你沒有此權(quán)限')
#顯示課程列表
def listlesson(request):
typeId=request.GET.get('lessontypeid',0)
#lessons = models.LessonType.objects.get(id=typeId).lesson_set.all().values_list('lessonName',flat=True)
lessons = models.LessonType.objects.get(id=typeId).lesson_set.all()
return render(request,'lesson/show_lesson.html',{'list':lessons,})
#顯示課程分類
def showLessonType(request):
items = models.LessonType.objects.values_list('id','typeName')
print items[0][0]
return render(request,'lesson/showlessontype.html',{'items':items})
#選課
def selectLesson(request):
lessonid = request.GET.get('lessonid',0)
lesson = models.Lesson.objects.get(id=lessonid)
user = models.User.objects.get(id=request.session['userid'])
lesson.selectedUser.add(user)
return HttpResponse('恭喜你選課成功')
#顯示用戶所選課程
def showSelectedLessons(request):
user = models.User.objects.get(id=request.session['userid'])
list = user.lesson_set.all()
return render(request,'lesson/mylessons.html',{'list':list})
#取消所選課程
def cancelSelectedLessons(request):
lessonid = request.GET.get('lessonid',0)
lesson = models.Lesson.objects.get(id=lessonid)
user = models.User.objects.get(id=request.session['userid'])
lesson.selectedUser.remove(user)
return HttpResponse('取消成功')
#顯示一門課程的學(xué)生
def showStudents(request):
lessonid = request.GET.get('lessonid',0)
lesson = models.Lesson.objects.get(id=lessonid)
list = lesson.selectedUser.all()
return render(request,'lesson/showstudents.html',{'list':list})
# 首頁
def index(request):
return render(request,'lesson/index.html')

首頁
功能持續(xù)完善中。