Django+xadmin打造在线考试系统(二)
文章同步发于公众号: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
- models.py定义各类数据的格式;
- views.py各类操作的逻辑实现,如用户登录获取用户提交信息后如何进行身份核对;
- static用于存放网页的配置文件JS,CSS,Icon,Img等;
- templates存放HTML文件;
- settings.py为项目的基本设置,如连接数据库的信息;
- urls.py为网站链接的管理。
/2/用户登录和注册界面的设计
用户注册,是将用户填写的符合格式要求的信息存入数据库中,在上期中已经定义了用户的信息组成。主要操作为:
- models已完成;
- 建立表单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~
1024程序开发者社区的交流群已经建立,许多小伙伴已经加入其中,感谢大家的支持。大家可以在群里就技术问题进行交流,还没有加入的小伙伴可以扫描下方“社区物业”二维码,让管理员帮忙拉进群,期待大家的加入。
image
//猜你喜欢//