=All about Django=

查看版本

import django
print django.VERSION

创建项目

$ django-admin.py startproejct mysite # 在当前目录创建一个名为 mysite 的 django 项目

Manage.py

$ python manage.py runserver # 运行服务器,默认地址http://127.0.0.1:8000/
$ python manage.py runserver 0.0.0.0:8000 # 这样就能通过8000端口从外部访问了...
$ python manage.py startapp myapp # 创建一个名为 myapp 的 app
$ python manage.py validate # 检查 models 的语法和逻辑是否正确
$ python manage.py sqlall # 只显示一下会执行哪些 SQL 语句,并不会真正执行
$ python manage.py syncdb # 执行 SQL 到数据库

URLconf

from django.conf.urls.defaults import patterns, url
from views import home_view, time_ahead

urlpatterns = patterns('',
    url(r'^$', home_view),
    url(r'^time/plus/(\d{1,2})/(\d{1,2})/$', time_ahead), # () 用来从 URL 中取值并传给 views,所以 time_ahead(request, value1, value2)
    url(r'^time/plus/(?P<value1>\d{1,2})/(?P<value2>\d{1,2})/$', time_ahead), # 跟上面一样,但可以按变量名取值了
)

正则表达式

符号 匹配
. 任意单个字符
^ 以...开始
$ 以...结束
\d 任意单个数字
[A-Z] 从A到Z的任意大写字母
[a-z] 从a到z的任意小写字母
[A-Za-z] 从A到z的任意字母(大小写不敏感)
+ 一个或多个前置表达式,如 \d+ 表示一个或多个数字
* 零个或多个前置表达式
? 零个或一个前置表达式
{m, n} 重复m到n次前置表达式, 如 \d{1, 3} 能够匹配1位,2位或者3位数字

模板

{% for %}

{{ forloop.counter }} # 输出当前循环数,从1开始
{{ forloop.counter0 }} # 跟上面一样,只不过从0开始...
{{ forloop.revcounter }} # 剩余循环次数(包括当前循环)
{{ forloop.revconuter0 }} # 跟上面一样,但每一次都是上面的值减1
{{ forloop.first }} # 判断是否是第一次循环,如果是就返回 True,否则返回 False
{{ forloop.last }} # 判断是否是最后一次循环,如果是就返回 True,否则返回 False
{{ forloop.parentloop }} # 用于嵌套循环时,相当于母循环的 forloop

{% ifequal %}

{% ifequal user currentuser %} # 判断 user 和 currentuser 是否相等

{% comment %}

{# 这是单行注释 #}

{% comment %}
这是多行注释
{% endcomment %}

通过管道符进行转换

{{ name|lower }} # 将 name 转换成小写
{{ my_list|first|upper }} # 输出 my_list 的第一个元素,并将其转换为大写
{{ bio|truncatewords:"30" }} # 输出bio的前30个单词

{% include %}

{% include 'nav.html %} # 将 nav.html 的内容导入当前模板

模板继承

#main.html
<!DOCTYPE HTML>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{% block title %}{% endblock %}</title>
</head>
<body>
    {% block header %}{% endblock %}
    {% block contant %}{% endblock %}
    {% block footer %}{% endblock %}
</body>
</html>

#template.html
{% extends "main.html" %}

{% block title %}我是标题..{% endblock %}
{% block content %}我是内容...{% endblock %}

Model

在 models.py 里定义表

from django.db import models

class Publisher(models.Model):
    name = models.CharField(max_length=30) # CharField 必须有一个 max_length 参数

    def __unicode__(self): # 返回值(Unicode 对象)可以替代一个 Publisher 对象
        return self.name

    class Meta:
        ordering = ['name'] # 按 name 排序

在 views.py 里执行对数据库的操作

from models import Publisher

p1 = Publisher(name='Apress') # p1 为 Publisher对象,其 name 为 Apress
p1.save() # 将 p1 保存到数据库中

p2 = Publisher.objects.create(name="O'Reilly") # 创建一个 name 为 O'Reilly 的 Publisher 对象,并保持到数据库中

Publisher.objects.all() # 取出 Publisher 表中的所有对象
Publisher.objects.order_by("name") # 取出 Publisher 表中的所有对象并按照 name 排序,若要倒序,只要在 name 前面加个 - 即可,即 order_by("-name")
Publisher.objects.filter(name__contains="press") # 取出 Publisher 表中的 name 中包含 press 的对象
Publisher.objects.filter(id=1).update(name='Apress Publishing') # 更新记录
Publisher.objects.filter(name='Apress').delete() # 删除

HttpRequest对象

request.PATH 请求的路径,不包含域和参数
request.get_host()
request.get_full_path() 请求的路径,包含参数
request.is_secure() 判断是否 https
request.META HTTP header 里包含的信息(字典类型),如 request.META['HTTP_USER_AGENT'] 获取用户浏览器的 UA,request.META['REMOTE_ADDR'] 获取请求来源的 IP
request.GET['name'] 从 GET 请求中获取 name 的值
request.POST['password'] 从 POST 请求中获取 password 的值

Form

# 在 forms.py 里定义一个 ContactForm 表单
from django import forms

class ContactForm(forms.Form):
    subject = forms.CharField()
    email = forms.EmailField(required=False, label='Your e-mail address')
    message = forms.CharField(widget=forms.Textarea) # widget 用来重写字段为 <textarea>

    # 自定义验证规则,django 会自动寻找名为 clean_fieldname 的方法并在验证的时候执行
    def clean_message(self):
        message = self.cleaned_data['message']
        num_words = len(message.split())
        if num_words < 4:
            raise forms.ValidationError("Not enough words!")
        return message # 记得 return !!!

# 在 views.py 调用 ContactForm
from forms import ContactForm

def test():
    # 声明一个 ContactForm 对象 f
    f = ContactForm()

    # 输出 f 为 table 格式
    print f

    # 输出 f 为 ul 格式
    print f.as_ul()

    # 输出subject 字段(<input type="text" />)
    print f['subject']

    # 验证表单
    f = ContactForm({'subject': 'Hello', 'email': 'test@verycb.me', 'message': 'nice site!'})
    f.is_valid() # True
    f.is_bound # True
    f.errors # 输出错误
    f.cleaden_data # 输出字典类型的表单数据

    # 表单初始化
    f = ContactForm(
        initial = {'subject': 'I love your site!'}
    )