1.新建model
class Member(models.Model):
name=models.CharField(max_length=200)
password = models.CharField(max_length=200)
address=models.CharField(max_length=200)
createDate = models.DateTimeField('参与时间')
level = models.IntegerField(default=0)
# ...
def __str__(self):
return smart_unicode(self.name)
def __unicode__(self):
return self.name
这里有一个坑,如果直接
def __str__(self):
return self.name
会出现中文问题,也就是在页面上,无法保存这个model。 后来看到有人提供的解决办法
# ...
def __str__(self):
return smart_unicode(self.name)
然并卵,最好还是补一个unicode方法好了。
在后台主页面,根据Django的插件哲学,默认是不展示新加入的model的,必须在member的admin文件中,注册这个对象
from django.contrib import admin
# Register your models here.
from .models import *
admin.site.register(Member)
admin.site.register(Class)
然后,在项目的settings文件中,安装这个插件(新应用)
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.sites',
'member.apps.MemberConfig',
]
这个时候,重启服务,就可以在后台对新建的model进行增删改查操作了。
2.views路由
https://docs.djangoproject.com/en/1.9/topics/http/urls/
为了符合django的插件哲学,每一个应用应该有自己的urls.py文件,负责自己模块的路径,然后在最上层项目的urls.py文件里面include
# 模块文件
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^$', views.index, name='index'),
url(r'^addCustomer', views.addCustomer, name='addCustomer'),
url(r'^selectSeat', views.selectSeat, name='selectSeat'),
]
#项目文件
from django.conf.urls import url, include
from django.contrib import admin
urlpatterns = [
url(r'^member/', include('member.urls')),
url(r'^customer/', include('customer.urls')),
url(r'^admin/', admin.site.urls),
]
3.使用pyjade作为模板引擎
默认模板引擎为ejs,之前写nodejs,用了express,觉得配上node很爽。适应了语法之后,效率奇高。在github上找到这个项目,适配python版本 https://github.com/syrusakbary/pyjade
处理的时候遇到了个大坑,就是django的静态文件处理有一套比价鸡肋的加载规则。默认是在应用下面的static文件夹下面搜索,所以你要在页面模板里面,把STATIC_URL这个文件加载一下,这样才能在静态文件的路径里面使用,比如:{% static 'customer/login.js' %} 这个诡异的语法或者说语法糖,会交由django的默认渲染引擎消化,然后再传给pyjade,最后翻译成正确的html
!!! 5
// 给django引擎传递数据
{% load static %}
html(lang="zh-CN")
head
title= "注册"
link(href="http://cdn.bootcss.com/bootstrap/3.3.0/css/bootstrap.min.css" rel="stylesheet")
link(href="http://cdn.bootcss.com/bootstrap/3.3.0/css/bootstrap-theme.min.css" rel="stylesheet")
script(src="http://cdn.static.runoob.com/libs/jquery/2.1.1/jquery.min.js")
script(src="http://cdn.bootcss.com/bootstrap/3.3.0/js/bootstrap.min.js")
script(src="https://cdnjs.cloudflare.com/ajax/libs/jquery.form/3.51/jquery.form.js")
script(src="{% static 'customer/login.js' %}")
link(rel="shortcut icon" href="{% static 'favicon.ico' %}")
body
4.ajax请求的CSRF问题
Django的安全策略: https://docs.djangoproject.com/en/1.10/topics/security/
对每一个view,都默认打开了CSR保护,这个保护机制只最有效最傻瓜式的。。。要求每次ajax请求,都要携带一个csrftoken值作为校验。当然,自己手动修改每个form要死了 https://docs.djangoproject.com/en/1.10/ref/csrf/
django提供了一个配置项,在代码的form里面加入{% csrf_token %},就可以自己每次post都携带一个csrf参数了
form.form-horizontal.center(action="/customer/addCustomer",method="post",id="loginForm",role="form")
{% csrf_token %}
div.control-group
label.label.center(for="name") 用户名
div.controls
input.input-lg.center-block(id="name",name="name",type="text")
div.center-block(id="warnName",style="color:red")
div.control-group
label.label(for="password") 密码
div.controls
input.input-lg.center-block(id="password",name="password",type="password")
div.center-block(id="warnPassword",style="color:red")
br
div.control-group
div.controls
button.btn.btn-primary.center-block(type="button",onclick="checkLogin()") 登陆
button.btn.btn-primary.center-block(type="button",onclick="checkLogin()") 注册
可以在浏览器里面看到,它会编译成
<form action="/customer/addCustomer" method="post" id="loginForm" role="form" class="form-horizontal center"><input type="hidden" name="csrfmiddlewaretoken" value="rbM3rz95OwRXj7nk5Dt45VZm6exdGkF0">
<div class="control-group">
<label for="name" class="label center">用户名</label>
<div class="controls">
<input id="name" name="name" type="text" class="input-lg center-block">
<div id="warnName" style="color:red" class="center-block"></div>
</div>
</div>
<div class="control-group">
<label for="password" class="label">密码</label>
<div class="controls">
<input id="password" name="password" type="password" class="input-lg center-block">
<div id="warnPassword" style="color:red" class="center-block"></div>
</div>
</div><br>
<div class="control-group">
<div class="controls">
<button type="button" onclick="checkLogin()" class="btn btn-primary center-block">登陆</button>
<button type="button" onclick="checkLogin()" class="btn btn-primary center-block">注册</button>
</div>
</div>
</form>
相当于在form里面加入了一个
<input type="hidden" name="csrfmiddlewaretoken" value="rbM3rz95OwRXj7nk5Dt45VZm6exdGkF0">
5.数据库的增删改查操作
django的models模块,做了和php类似的封装,所有model对象本身都封装了所有db操作方法。比如,我们需要通过一个页面上的ajax请求,在后台添加一个对象
import json
from django.shortcuts import render
from customer.models import *
import logging
from common.util import *
# Get an instance of a logger
logger = logging.getLogger('gym')
from django.utils import timezone
def addCustomer(request):
if request.method!="POST":
logger.error("addCustomer not support %s",request.method)
return getBadResponse(result="只支持POST")
logger.info(u'一切正常%s',request.POST)
name=request.POST['name']
password=request.POST['password']
creatDate=timezone.now()
try:
customer=Customer(name=name,password=password,createDate=creatDate)
customer.save()
except Exception,e:
logger.error("save customer error =%s",e)
return getGoodResponse("OK")