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