美文网首页djangoDjango待看
Django+xadmin打造在线考试系统(二)

Django+xadmin打造在线考试系统(二)

作者: f5065e26181b | 来源:发表于2019-03-21 16:22 被阅读34次

    文章同步发于公众号:1024程序开发者社区(cxkfzsq1024)

    上一次把models的设计和系统功能进行了介绍,本期主要介绍一下Django工程组成和原理,用户登录和注册界面的设计两部分内容。先上效果图:


    image
    image

    /1/Django工程组成和原理

    Django是一种基于Python的Web开发框架。Web开发指的是开发基于B/S架构,通过前后端的配合,将后台服务器的数据在浏览器上展现给前台用户的应用。在实际应用中,无论APP开发还是网站制作,基本都是这种模式。
    Django本身基于MVC模型,即Model(模型)+View(视图)+ Controller(控制器)设计模式,而又对MVC设计模式进行了修改,将视图分成View模块和Template模块两部分,也就是MTV模型:


    image

    模型(Model):用于封装与应用程序的业务逻辑相关的数据;
    模板(Template):将数据与HTML语言结合起来的引擎;
    视图(View):负责实际的业务逻辑实现。
    对应一个实际的工程,需要知道每个部分实现的功能和数据的流向,这样撸起代码才会有目的性。


    image
    1. models.py定义各类数据的格式;
    2. views.py各类操作的逻辑实现,如用户登录获取用户提交信息后如何进行身份核对;
    3. static用于存放网页的配置文件JS,CSS,Icon,Img等;
    4. templates存放HTML文件;
    5. settings.py为项目的基本设置,如连接数据库的信息;
    6. urls.py为网站链接的管理。

    /2/用户登录和注册界面的设计

    用户注册,是将用户填写的符合格式要求的信息存入数据库中,在上期中已经定义了用户的信息组成。主要操作为:

    1. models已完成;
    2. 建立表单form.py;
      Django在内部集成了一个表单功能,以面向对象的方式,直接使用Python代码生成HTML表单代码,用于数据的传输。在上图所示位置建立form.py,参照models方法,建立表单:
    class LoginForm(forms.Form):
        username = forms.CharField(required=True)
        password = forms.CharField(required=True, min_length=5)
        captcha = CaptchaField(error_messages={"invalid": u"验证码错误"})
    class RegisterForm(forms.Form):
        zhiwu_choices = (
          ('jingli', '经理'),
          ('zhiyuan', '职员'),
       )
        danwei_choices = (
          ('tengxun', '腾讯'),
          ('ali', '阿里'),
       )
        username = forms.IntegerField(min_value=10000000, max_value=99999999)
        nickname = forms.CharField(required=True, max_length=10)
        password = forms.CharField(required=True, min_length=5)
        danwei = forms.ChoiceField(label='所在单位',choices=danwei_choices, required=True)
        zhiwu = forms.ChoiceField( label='本人职务', choices=zhiwu_choices, required=True)
    

    3.templates建立register.html

    HTML网页可以下载一些好的模板,这里不多写。
    register_form在HTML中实现的功能,错误提示:

    <div class="form-group marb8 {% if register_form.errors.password %}errorput{% endif %}">
        <label>密码</label>
        <input type="password" id="id_password" name="password"   placeholder="请输入6-20位非中文字符密码" />
    </div>
    
    image

    后期form在HTML中使用会非常频繁,将详细讲。

    4.views中建立register类。

    其中get()为界面初始化时的信息,post为一个完整的获取用户提交参数,判断和存储的过程,通过render()将form数据渲染到HTML中,这就是数据的一个完整流向。form是一个容器。

    class RegisterView(View):
        def get(self, request):
            register_form = RegisterForm()
            return render(request, "register.html", {"register_form": register_form, "title": title})
        def post(self, request):
            register_form = RegisterForm(request.POST)
            if request.method == 'POST':
                if register_form.is_valid():
                    user_name = request.POST.get("username", "")#账号
                    if UserProfile.objects.filter(username=user_name):
                        return render(request, "register.html",
                                    {"title": title,"register_form": register_form, "msg": u"该考号已经被注册"});
                    user_password = request.POST.get("password", "")
                    user_nickname = request.POST.get("nickname", "")
                    user_danwei = request.POST.get("danwei", "")
                    user_zhiwu = request.POST.get("zhiwu", "")
                    user_profile = UserProfile()
                    user_profile.username = user_name
                    user_profile.nickname = user_nickname
                    user_profile.danwei = user_danwei
                    user_profile.zhiwu = user_zhiwu
                    user_profile.is_active = True
                    user_profile.password = make_password(user_password)
                    user_profile.save()
                    # send_register_email(user_email, "register")
                    return render(request, "register.html", {"title": title,"msg":u"注册成功"})
                else:
                    return render(request, "register.html",{"register_form":register_form, "title": title})
            else:
                form = UserInfoForm(
                    initial={
    
                        'danwei':'腾讯',
                        'zhiwu': '经理',
                    }
                )
                return render(request, "register.html", {"register_form": form, "title": title})
    

    同理建立用户登录的功能,通过authenticate()判断用户是否有权限进入:

    class LoginView(View):
        def get(self, request):
            login_form = LoginForm()
            return render(request, "login.html", {"login_form":login_form, "title": title, "phoneNumber": phoneNumber})
    
        def post(self, request):
            print(1)
            login_form = LoginForm(request.POST)
    
            if login_form.is_valid():#验证表是否为空
                print(3)
                user_name = request.POST.get("username", "")
                print(4)
                user_password = request.POST.get("password", "")
                print(user_name)
                user = authenticate(username=user_name, password=user_password)
                print(user)
                if user is not None:
                    login(request, user)
                    return render(request, "index.html")
                else:
                    return render(request, "login.html", {"msg": "用户名或密码错误","login_form": login_form})
            else:
                return render(request, "login.html", {"login_form": login_form})
    

    以上是建立在线考试系统的第二部分,本次内容就到这里,还请各路大神指点。

    关注公众号,送海量学习资源,一起学django~

    image
    1024程序开发者社区的交流群已经建立,许多小伙伴已经加入其中,感谢大家的支持。大家可以在群里就技术问题进行交流,还没有加入的小伙伴可以扫描下方“社区物业”二维码,让管理员帮忙拉进群,期待大家的加入。
    image

    //猜你喜欢//

    相关文章

      网友评论

        本文标题:Django+xadmin打造在线考试系统(二)

        本文链接:https://www.haomeiwen.com/subject/kklcvqtx.html