djangoDjango待看

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

2019-03-21  本文已影响34人  f5065e26181b

文章同步发于公众号: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

//猜你喜欢//

上一篇下一篇

猜你喜欢

热点阅读