Django实战(二)- 创建一个课程选择系统1.需求2.代码操作

1.需求

1.登录注册

  • 编写用户注册功能(用户名、密码、确认密码)
  • 提供登录功能
  • 登陆后可以填写个人信息(昵称、年龄、头像)

2.功能

  • 第一个注册用户为管理员,管理员还可以创建、修改、删除课程分类信息,比如(计算机、文学、化学)
  • 管理员可以创建课程(每一门课程只能属于一个课程分类)、修改课程、删除课程、查看选择某一门学科的所有学生列表、查看某一分类的所有学科。
  • 所有用户都可以查看课程列表,并将课程加到自己的已选课程列表中;所有用户可以查看自己选择的课程列表、查看课程详细介绍、从自己的课程列表中删除某一门课程

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(导航栏)
<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="#">选课系统</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="请输入关键词">
            </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>显示课程的学生</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'), #显示每个课程类型下的学科
    url(r'^selectlesson/$',views.selectLesson,name='selectlesson'), #选课
    url(r'^showseleteles/$', views.showSelectedLessons, name='showseleteles'),  #显示用户已经选的课程
    url(r'^cancelseleteles/$',views.cancelSelectedLessons,name='cancelseleteles'), #取消所选课程
    url(r'^showstudents/$',views.showStudents,name='showstudents'), #显示每一门学科的学生

]
  • 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 = '用户名已经存在,请换一个用户名试试!'
                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如果不存在对应的值
    id = session.get('userid',None)
    if id==None:
        #转到登录页面
        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('抱歉,你没有此类权限!')

#完善信息
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('信息已经完善,你可以进行下一步操作了')

            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()
                #初始化选项列表,从数据库中查找
                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']
                    #查找母表中的数据
                    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('你没有操作的权限!')


# 修改课程所属分类
def editlessontype(request):
    #验证是否登录
    isLogin,next = checkLogin(request.session)
    if not isLogin:
        #转到登录页面
        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('你没有此权限')



#显示课程列表
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('取消成功')

#显示一门课程的学生
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')

首页

功能持续完善中。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏FreeBuf

适用于渗透测试不同阶段的工具收集整理

该资源清单列表涵盖了一系列,适用于渗透测试不同阶段的开源/商业工具。如果你想为此列表添加贡献,欢迎你向我发送pull request。

9110
来自专栏阮一峰的网络日志

fortune 命令简介

美国中餐馆的最后一道菜,往往是小甜饼,叫做"幸运饼"(fortune cookie)。 ? 里面有一张纸条,写着人生格言。 这种形式的格言,显然很受欢迎。早在1...

3088
来自专栏CaiRui

RAID技术

磁盘阵列(Redundant Arrays of Independent Disks,RAID),有“独立磁盘构成的具有冗余能力的阵列”之意。 磁盘阵列是由很多...

40215
来自专栏FreeBuf

极客DIY:使用Arduino制作一块开源手表

1 - 引言 首先让我们看下这个项目要考虑到的问题: 1.)使用100%Arduino兼容性硬件 2.)保证存储器足够大可以装下大量的稍后会扩展的新内容 ...

2626
来自专栏NetCore

微信公众平台快速开发框架 For Core 2.0 beta –JCSoft.WX.Core 5.2.0 beta发布

写在前面 最近比较忙,都没有好好维护博客,今天拿个半成品来交代吧。 记不清上次关于微信公众号快速开发框架(简称JCWX)的更新是什么时候了,自从更新到支持.Ne...

2658
来自专栏菩提树下的杨过

c#中开发ActiveX的学习笔记

1.为什么要用ActiveX? 网页本身的功能是有限的,要想实现一些网页本身不支持的功能,比如:网页上的p2p视频播放,就得靠ActiveX这种古老的技术。 2...

2605
来自专栏Jerry的SAP技术分享

利用CRM中间件Middleware从ERP下载Customer Material的常见错误

下图是我在ERP创建的Material,为其维护了一个Customer Material AOP。

3898
来自专栏我和未来有约会

Silverlight Cairngorm

Cairngorm这个词做过flex开发的朋友应该不会陌生,Cairngorm是Flex开发中的一个MVC框架,由Adobe官方提供支持。现在Silverlig...

2785
来自专栏FreeBuf

树莓派随身工具箱:中间人劫持获取控制权

上文讲解了树莓派随身工具箱的环境搭建,这段时间又对其进行了一些优化,主要是从便携美观上面改进。同时,在实际使用中发现了一些问题,并做了小小的改动。

2553
来自专栏跨界架构师

C#和NewSQL更配 —— TiDB入门(可能是C#下的全网首发)

  在上一篇尝试CockroachDB(传送门在此:http://www.cnblogs.com/Zachary-Fan/p/cockroachdb_net_c...

1101

扫码关注云+社区

领取腾讯云代金券