Django-02

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")

刘摸鱼

退堂鼓表演艺术家

杭州