模型:
由于 C 由框架自行处理,而 Django 里更关注的是模型(Model)、模板(Template)和视图(Views),Django 也被称为 MTV 框架
M 代表模型(Model),即数据存取层。 该层处理与数据相关的所有事务: 如何存取、如何验证有效性、包含哪些行为以及数据之间的关系等。
T 代表模板(Template),即表现层。 该层处理与表现相关的决定: 如何在页面或其他类型文档中进行显示。
V 代表视图(View),即业务逻辑层。 该层包含存取模型及调取恰当模板的相关逻辑。 你可以把它看作模型与模板之间的桥梁。
数据库配置也是在Django的配置文件里,缺省 是 settings.py 。
Django app包含:模型、视图、Django代码
创建app:
Django的模型能描述特定类型的数据字段比如Email地址、URL等等
比如创建:书籍/作者/出版商 数据库结构{一个作者有姓,有名及email地址。
出版商有名称,地址,所在城市、省,国家,网站。
书籍有书名和出版日期。 它有一个或多个作者(和作者是多对多的关联关系[many-to-many]), 只有一个出 版商(和出版商是一对多的关联关系[one-to-many],也被称作外键[foreign key])
}
模型的安装:
在setting.py中激活模型。就是把刚才创建的app添加到INSTALLED_APPS中
验证模型有效性:python manage.py validat
提交SQL语句至数据库:
在创建数据库对象的时候,需要注意save的使用,例如:
这样p1才存储进数据库
__unicode__() 代表某一个对象实体
修改数据库数据的时候也需要调用save方法
查找:
查找所有对象:Publisher.objects.all()
可以使用`` filter()`` 方法对数据进行过滤
精确查找:Publisher.objects.filter(name='Apress')
模糊匹配:Publisher.objects.filter(name__contains="press")
get()方法获得一个对象:Publisher.objects.get(name="Apress")
一般查找的时候要考虑查找不到时的异常的捕捉{ try: except:}
对象排序:
Publisher.objects.order_by("name")
对象删除:
获取后删除: p = Publisher.objects.get(name="O'Reilly") p.delete()
------------------------------------------------------------------------------------------
Django站点管理:
激活管理界面:
1:修改setting文件(将'django.contrib.admin'加入setting的INSTALLED_APPS配置中 ;保证INSTALLED_APPS中包含'django.contrib.auth','django.contrib.contenttypes'和'django.contrib.sessions',Django的管理工具需要这3个包;确保MIDDLEWARE_CLASSES 包含'django.middleware.common.CommonMiddleware' 、'django.contrib.sessions.middleware.SessionMiddleware' 和'django.contrib.auth.middleware.AuthenticationMiddleware' 。)
2:生成超级账户
3:讲admin访问配置在URLcnf中
使用管理界面:
尝试数据库用户的增删查改
将Models加入到Admin中:
1:进入app目录下
2:创建admin.py(from django.contrib import admin;from mysite.books.models import Publisher, Author, Book;admin.site.register(Publisher);admin.site.register(Author);admin.site.register(Book))
3:刷新管理界面
管理界面修改:
可以实现页面信息的显示形式、选择框、排序条、导航条等
n对m关系的选择实现:filter_horizontal:
用户、用户组、权限:
每个用户的三个标记:
活动标志,它用来控制用户是否已经激活。 如果一个用户帐号的这个标记是关闭状态,而用户又尝试用它登录时,即使密码正确,他也无法登录系统。
成员标志,它用来控制这个用户是否可以登录管理界面(即:这个用户是不是你们组织里的成员) 由于用户系统可以被用于控制公众 页面(即:非管理页面)的访问权限,这个标志可用来区分公众用户和管理用户。
超级用户标志,它赋予用户在管理界面中添加、修改和删除任何项目的权限。 如果一个用户帐号有这个标志,那么所有权限设置(即 使没有)都会被忽略。
------------------------------------------------------------------------------
表单:
1:从Request对象中获取数据
2:有关Request的其他信息
HTTP_REFERER,进站前链接网页
HTTP_USER_AGENT,用户浏览器的user-agent字符串
REMOTE_ADDR 客户端IP
3:数据提交:GET和POST方式
contact()视图代码:
Django的form库:
表单框架最主要的用法是,为每一个将要处理的HTML的`` <Form>`` 定义一个Form类。 在这个例子中,我们只有一个`` <Form>`` ,因此我们只需定义一个Form类。 这个类可以存在于任何地方,甚至直接写在`` views.py`` 文件里也行,但是社区的惯例是把Form类都放到一个文件中:forms.py。
form对象:第一件事是将自己显示成HTML,第二件事是校验数据(校验时:传入数据生成一个form实体,然后调用实体.is_valid(),就会显示数据的正确性)
在视图中使用Form对象:
# contact_form.html
设置最大长度:提供max_length参数,选项min_length参数同样可用。
自定义校验规则:主要是用在一些自己需要检测的规则的书写,比如填写的反馈信息无效,那么如何判断无效呢?一种方法就是判断文字的长度,比如少于两个字就是无效:方法一般绑定在form类上,比如对message的测试:
这个方法会在默认校验逻辑执行之后被调用。
指定标签:
自定义字段的标签。 仅需使用label。例如:email = forms.EmailField(required=False,label='Your e-mail address')
使用缺省视图参数:
你可以给一个视图指定默认的参数。 这样,当没有给这个参数赋值的时候将会使用默认的值。
# urls.py
# views.py
在这里,两个URL表达式都指向了同一个视图 views.page ,但是第一个表达式没有传递任何参数。 如果匹配到了第一个样式, page() 函数将会对参数 num 使用默认值 "1" ,如果第二个表达式匹配成功, page() 函数将使用正则表达式传递过来的num的值。
对于一系列的url具体相似结果时,对于特殊的可以先判断,这样就不会把url混搭到view中了。
由于 C 由框架自行处理,而 Django 里更关注的是模型(Model)、模板(Template)和视图(Views),Django 也被称为 MTV 框架
M 代表模型(Model),即数据存取层。 该层处理与数据相关的所有事务: 如何存取、如何验证有效性、包含哪些行为以及数据之间的关系等。
T 代表模板(Template),即表现层。 该层处理与表现相关的决定: 如何在页面或其他类型文档中进行显示。
V 代表视图(View),即业务逻辑层。 该层包含存取模型及调取恰当模板的相关逻辑。 你可以把它看作模型与模板之间的桥梁。
数据库配置也是在Django的配置文件里,缺省 是 settings.py 。
Django app包含:模型、视图、Django代码
创建app:
python manage.py startapp "app-name"
Django的模型能描述特定类型的数据字段比如Email地址、URL等等
比如创建:书籍/作者/出版商 数据库结构{一个作者有姓,有名及email地址。
出版商有名称,地址,所在城市、省,国家,网站。
书籍有书名和出版日期。 它有一个或多个作者(和作者是多对多的关联关系[many-to-many]), 只有一个出 版商(和出版商是一对多的关联关系[one-to-many],也被称作外键[foreign key])
}
在model.py中编辑原型:
from django.db import models
class Publisher(models.Model):
name = models.CharField(max_length=30)
address = models.CharField(max_length=50)
city = models.CharField(max_length=60)
state_province = models.CharField(max_length=30)
country = models.CharField(max_length=50)
website = models.URLField()
class Author(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=40)
email = models.EmailField()
class Book(models.Model):
title = models.CharField(max_length=100)
authors = models.ManyToManyField(Author)
publisher = models.ForeignKey(Publisher)
publication_date = models.DateField()
模型的安装:
在setting.py中激活模型。就是把刚才创建的app添加到INSTALLED_APPS中
验证模型有效性:python manage.py validat
生成create table语句:
python manage.py sqlall "app-name"
提交SQL语句至数据库:
python manage.py syndb
在创建数据库对象的时候,需要注意save的使用,例如:
>>> from books.models import Publisher
>>> p1 = Publisher(name='Apress', address='2855 Telegraph Avenue',
... city='Berkeley', state_province='CA', country='U.S.A.',
... website='http://www.apress.com/')
>>> p1.save()
这样p1才存储进数据库
__unicode__() 代表某一个对象实体
修改数据库数据的时候也需要调用save方法
查找:
查找所有对象:Publisher.objects.all()
可以使用`` filter()`` 方法对数据进行过滤
精确查找:Publisher.objects.filter(name='Apress')
模糊匹配:Publisher.objects.filter(name__contains="press")
get()方法获得一个对象:Publisher.objects.get(name="Apress")
一般查找的时候要考虑查找不到时的异常的捕捉{ try: except:}
对象排序:
Publisher.objects.order_by("name")
对象删除:
获取后删除: p = Publisher.objects.get(name="O'Reilly") p.delete()
------------------------------------------------------------------------------------------
Django站点管理:
激活管理界面:
1:修改setting文件(将'django.contrib.admin'加入setting的INSTALLED_APPS配置中 ;保证INSTALLED_APPS中包含'django.contrib.auth','django.contrib.contenttypes'和'django.contrib.sessions',Django的管理工具需要这3个包;确保MIDDLEWARE_CLASSES 包含'django.middleware.common.CommonMiddleware' 、'django.contrib.sessions.middleware.SessionMiddleware' 和'django.contrib.auth.middleware.AuthenticationMiddleware' 。)
2:生成超级账户
3:讲admin访问配置在URLcnf中
使用管理界面:
尝试数据库用户的增删查改
将Models加入到Admin中:
1:进入app目录下
2:创建admin.py(from django.contrib import admin;from mysite.books.models import Publisher, Author, Book;admin.site.register(Publisher);admin.site.register(Author);admin.site.register(Book))
3:刷新管理界面
管理界面修改:
可以实现页面信息的显示形式、选择框、排序条、导航条等
n对m关系的选择实现:filter_horizontal:
class BookAdmin(admin.ModelAdmin):
list_display = ('title', 'publisher', 'publication_date')
list_filter = ('publication_date',)
date_hierarchy = 'publication_date'
ordering = ('-publication_date',)
**filter_horizontal = ('authors',)**
用户、用户组、权限:
每个用户的三个标记:
活动标志,它用来控制用户是否已经激活。 如果一个用户帐号的这个标记是关闭状态,而用户又尝试用它登录时,即使密码正确,他也无法登录系统。
成员标志,它用来控制这个用户是否可以登录管理界面(即:这个用户是不是你们组织里的成员) 由于用户系统可以被用于控制公众 页面(即:非管理页面)的访问权限,这个标志可用来区分公众用户和管理用户。
超级用户标志,它赋予用户在管理界面中添加、修改和删除任何项目的权限。 如果一个用户帐号有这个标志,那么所有权限设置(即 使没有)都会被忽略。
------------------------------------------------------------------------------
表单:
1:从Request对象中获取数据
2:有关Request的其他信息
HTTP_REFERER,进站前链接网页
HTTP_USER_AGENT,用户浏览器的user-agent字符串
REMOTE_ADDR 客户端IP
3:数据提交:GET和POST方式
POST数据是来自HTML中的〈form〉标签提交的,而GET数据可能来自〈form〉提交也可能是URL中的查询字符串(the query string)。
当我们提交表单仅仅需要获取数据时就可以用GET; 而当我们提交表单时需要更改服务器数据的状态,或者说发送e-mail,或者其他不仅仅是获取并显示数据的时候就使用POST。
简单的验证:
关于JAVASCRIPT验证:
此验证是实现在浏览器端的数据的验证,不过即使在浏览器端验证了,在服务器端也要进行验证,因为有的JAVASCRIPT验证被禁止了
编写Contact表单:
这个表单包括用户提交的反馈信息,一个可选的e-mail回信地址。 当这个表单提交并且数据通过验证后,系统将自动发送一封包含题用户提交的信息的e-mail给站点工作人员。
contact_form.html:
<html>
<head>
<title>Contact us</title>
</head>
<body>
<h1>Contact us</h1>
{% if errors %}
<ul>
{% for error in errors %}
<li>{{ error }}</li>
{% endfor %}
</ul>
{% endif %}
<form action="/contact/" method="post">
<p>Subject: <input type="text" name="subject"></p>
<p>Your e-mail (optional): <input type="text" name="email"></p>
<p>Message: <textarea name="message" rows="10" cols="50"></textarea></p>
<input type="submit" value="Submit">
</form>
</body>
</html>
contact()视图代码:
def contact(request):
errors = []
if request.method == 'POST':
if not request.POST.get('subject', ''):
errors.append('Enter a subject.')
if not request.POST.get('message', ''):
errors.append('Enter a message.')
if request.POST.get('email') and '@' not in request.POST['email']:
errors.append('Enter a valid e-mail address.')
if not errors:
send_mail(
request.POST['subject'],
request.POST['message'],
request.POST.get('email', 'noreply@example.com'),
['siteowner@example.com'],
)
return HttpResponseRedirect('/contact/thanks/')
return render_to_response('contact_form.html',
{'errors': errors})
Django的form库:
表单框架最主要的用法是,为每一个将要处理的HTML的`` <Form>`` 定义一个Form类。 在这个例子中,我们只有一个`` <Form>`` ,因此我们只需定义一个Form类。 这个类可以存在于任何地方,甚至直接写在`` views.py`` 文件里也行,但是社区的惯例是把Form类都放到一个文件中:forms.py。
form对象:第一件事是将自己显示成HTML,第二件事是校验数据(校验时:传入数据生成一个form实体,然后调用实体.is_valid(),就会显示数据的正确性)
在视图中使用Form对象:
# views.py
from django.shortcuts import render_to_response
from mysite.contact.forms import ContactForm
def contact(request):
if request.method == 'POST':
form = ContactForm(request.POST)
if form.is_valid():
cd = form.cleaned_data
send_mail(
cd['subject'],
cd['message'],
cd.get('email', 'noreply@example.com'),
['siteowner@example.com'],
)
return HttpResponseRedirect('/contact/thanks/')
else:
form = ContactForm()
return render_to_response('contact_form.html', {'form': form})
# contact_form.html
<html>
<head>
<title>Contact us</title>
</head>
<body>
<h1>Contact us</h1>
{% if form.errors %}
<p style="color: red;">
Please correct the error{{ form.errors|pluralize }} below.
</p>
{% endif %}
<form action="" method="post">
<table>
{{ form.as_table }}
</table>
<input type="submit" value="Submit">
</form>
</body>
</html>
设置最大长度:提供max_length参数,选项min_length参数同样可用。
自定义校验规则:主要是用在一些自己需要检测的规则的书写,比如填写的反馈信息无效,那么如何判断无效呢?一种方法就是判断文字的长度,比如少于两个字就是无效:方法一般绑定在form类上,比如对message的测试:
from django import forms
class ContactForm(forms.Form):
subject = forms.CharField(max_length=100)
email = forms.EmailField(required=False)
message = forms.CharField(widget=forms.Textarea)
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
这个方法会在默认校验逻辑执行之后被调用。
指定标签:
自定义字段的标签。 仅需使用label。例如:email = forms.EmailField(required=False,label='Your e-mail address')
第八章:高级视图和URL配置
使用多个视图前缀:
在实践中,如果你使用字符串技术,特别是当你的 URLconf 中没有一个公共前缀时,你最终可能混合视图。 然而,你仍然可以利用视图前缀的简便方式来减少重复。 只要增加多个 patterns() 对象,象这样:
from django.conf.urls.defaults import *
urlpatterns = patterns('mysite.views',
(r'^hello/$', 'hello'),
(r'^time/$', 'current_datetime'),
(r'^time/plus/(\d{1,2})/$', 'hours_ahead'),
)
urlpatterns += patterns('weblog.views',
(r'^tag/(\w+)/$', 'tag'),
)
使用缺省视图参数:
你可以给一个视图指定默认的参数。 这样,当没有给这个参数赋值的时候将会使用默认的值。
# urls.py
from django.conf.urls.defaults import *
from mysite import views
urlpatterns = patterns('',
(r'^blog/$', views.page),
(r'^blog/page(?P<num>\d+)/$', views.page),
)
# views.py
def page(request, num='1'):
# Output the appropriate page of blog entries, according to num.
# ...
在这里,两个URL表达式都指向了同一个视图 views.page ,但是第一个表达式没有传递任何参数。 如果匹配到了第一个样式, page() 函数将会对参数 num 使用默认值 "1" ,如果第二个表达式匹配成功, page() 函数将使用正则表达式传递过来的num的值。
对于一系列的url具体相似结果时,对于特殊的可以先判断,这样就不会把url混搭到view中了。