Django笔记(二)之

所谓的视图函数(或 视图 ),只不过是一个接受 Web 请求并返回 Web 响应的 Python 函数

1、views.py与urls.py

view.py里创建函数,url.py建立路径,包含函数名,表示所有指向URL的请求都应由该视图函数来处理。

urls.py

from django.conf.urls.defaults import * 
from mysite.views import current_datetime
urlpatterns = patterns('',
				(r'^time/$', current_datetime), ) #上箭头要求表达式对字符串的头部进行匹配,美元符号则 要求表达式对字符串的尾部进行匹配。

Django是怎么处理请求的: settings.py里的ROOT_URLCONF 告诉Django哪个Python模块应该用作本网站的 URLconf,然后按顺序逐个匹配URLconf里的URLpatterns,直到找到一个匹配的。当找到这个匹配 的URLpatterns就调用相关联的view函数,并把 HttpRequest 对象作为第一个参数。

2、动态URL

使用正则表达式模式 \d+ 来匹配一个或多个数字

from django.conf.urls.defaults import *
from mysite.views import current_datetime, hours_ahead
urlpatterns = patterns('', 
		(r'^time/$', current_datetime),
    (r'^time/plus/\d+/$', hours_ahead),
)

3、模板

模板是一个纯文本文件,或是一个用Django模板语言标记过的普通的Python字符串,一个模板可以包含区块标签和变量。一个区块标签可 以生成内容,可以作为一个控制结构( if 语句或 for 循环),可以获取数据库内容,或者访问其他的模板标签。区块标签被 {% 和 %} 环绕。

模板 渲染 就是是通过从context获取值来替换模板中变量并执行所有的区块标签。

3.1 变量

用户两个大括号括起来的文字(例如 {{ person_name }} )是变量(variable) 。这意味着将按照给定的名字插入变量的值。

3.2 标签

(1)if {% if %} 标签检查(evaluate) 一个变量,如果这个变量为真(即,变量存在,非空,不是布尔值 假),系统会显示在 {% if %} 和 {% endif %} 之间的任何内容.

# today_is_weekend是变量

 {% if today_is_weekend %} 
		<p>Welcome to the weekend!</p>
{% else %}
		<p>Get back to work.</p>
{% endif %}

(2)for

<ul>
{% for athlete in athlete_list %}
		<li>{{ athlete.name }}</li> {% endfor %}
</ul>

(3)ifequal {% ifequal %} 标签比较两个值,当他们相同时,显示在 {% ifequal %} 和 {% endifequal %} 之中所有的值。

{% ifequal user currentuser %} 
		<h1>Welcome!</h1>
{% endifequal %}

(4)注释

{# This is a comment #}

(5)过滤器 显示的内容是变量 {{ name }} 被过滤器 lower 处理后的结果,它功能是转换文本为小写。 使用 | 来应用过滤器。

{{ name|lower }}

3.3 在setting.py添加设置

要加载模板,首先需要将模板的保存位置告诉框架,

settings.py

TEMPLATES = [
		......
    'DIRS': [os.path.join(BASE_DIR, 'templates')],
		.......
]

3.4 render_to_response()

模板加载、上下文创建、模板解析和 HttpResponse 创建 工作均在对 render_to_response() 的调用中完成了 这里的current_data是template里的变量

views.py

from django.shortcuts import render_to_response 
import datetime
def current_datetime(request):
		now = datetime.datetime.now()
		return render_to_response('current_datetime.html', {'current_date': now})

4、模型model

4.1

str() 方法告诉Python要怎样把对象当作字符串来使用,怎么显示。

from django.db import models

class Publisher(models.Model):
		name = models.CharField(maxlength=30)
		address = models.CharField(maxlength=50)
		city = models.CharField(maxlength=60) 
		state_province = models.CharField(maxlength=30) 
		country models.CharField(maxlength=50) 
		website = models.URLField()
		
		**def __str__(self):** 
					**returnself.name**

4.2

(1)Publisher.objects.all() 含义 首先,我们有一个已定义的模型 Publisher,objects是一个管理器,处理数据表的操作, all() 方法是 objects 管理器返回所有记录的一个方法。 (2)数据过滤

>>> Publisher.objects.filter(name="Apress Publishing")

相当于

SELECT
		id, name, address, city, state_province, country, website
FROM book_publisher
WHERE name = 'Apress Publishing';

(3)获取单个对象

 >>> Publisher.objects.get(name="Apress Publishing")

(4)排序

>>> Publisher.objects.order_by("name")

指定逆向排序

 >>> Publisher.objects.order_by("-name")

或者: 这个 ordering = ["name"]告诉Django如果没有显示提供 order_by() , 就缺省按名称排序。 Django使用内部类Meta存放用于附加描述该模型的元数据,这个类完全可以不实现。

class Publisher(models.Model):
		name = models.CharField(maxlength=30)
		address = models.CharField(maxlength=50)
		city = models.CharField(maxlength=60) 
		state_province = models.CharField(maxlength=30) 
		country = models.CharField(maxlength=50) 
		website = models.URLField()
		
		def __str__(self): 
				return self.name
				
		**class Meta:**
				**ordering = ["name"]**

5、Django管理站点

models.py

class Book(models.Model):
		title = models.CharField(maxlength=100) 
		authors = models.ManyToManyField(Author) 
		publisher = models.ForeignKey(Publisher) 
		publication_date = models.DateField()
		
		class Admin:
				**list_display = ('title', 'publisher', 'publication_date')** 
				**list_filter = ('publisher', 'publication_date')** 
				**ordering = ('-publication_date',)**
				**search_fields = ('title',)**

list_display 选项控制变更列表所显示的列 list_filter 选项在右边创建一个过滤条 search_fields 选项创建了一个允许搜索文本内容的域

6、表单处理

views.py

from django.db.models import Q
from django.shortcuts import render_to_response 
from models import Book

def search(request):
		query = request.GET.get('q', '') #寻找名为 q 的GET参数,而且如果参数没有提交,返回一个空的字符串
		if query:
				qset = (
						Q(title__icontains=query) | 
						Q(authors__first_name__icontains=query) |
						Q(authors__last_name__icontains=query)
				)
				results = Book.objects.filter(qset).distinct()
		else:
				results = []
		return render_to_response("books/search.html", {
				"results": results,
				"query": query })

(1)什么是 GET and POST 数据? GET 和POST 是浏览器使用的两个方法,用于发送数据到服务器端。一般来说,会在html表单里面看到:

<form action="/books/search/" method="get">

它指示浏览器向/books/search/ 以GET 的方法提交数据

()补充: 当一个页面被请示时,Django创建一个包含请求元数据的 HttpRequest 对象。 然后Django调入合适的视图,把 HttpRequest 作为视图的函数的第一个参数 传入。每个视图要负责返回一个 HttpResponse 对象。

1)HttpRequest对象 HttpRequest 表示来自某客户端的一个单独的HTTP请求。HttpRequest对象的属性包括method,GET,POST,COOKIES 例子:

<form action="/foo/bar/" method="post"> 
<input type="text" name="your_name" /> 
<select multiple="multiple" name="bands">
		<option value="beatles">The Beatles</option> 
		<option value="who">The Who</option>
		<option value="zombies">The Zombies</option>
</select>
<input type="submit" />
</form>

如果用户在 your_name 中输入 "John Smith" ,并且在多选框中同时选择了The Beatles和The Zombies

>>> request.GET
{}
>>> request.POST
{'your_name': ['John Smith'], 'bands': ['beatles', 'zombies']} 
>>> request.POST['your_name']
'John Smith'

2)HttpResponse 与Django自动创建的 HttpRequest 对象相比, HttpResponse 对象则是由你创建的。

>>> response = HttpResponse("Here's the text of the Web page.")