Django学习1.0
来源:互联网 发布:网络招商平台 编辑:程序博客网 时间:2024/06/10 07:16
模型:
由于 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 modelsclass 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.pyfrom django.shortcuts import render_to_responsefrom mysite.contact.forms import ContactFormdef 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 formsclass 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 viewsurlpatterns = 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中了。
0 0
- Django学习1.0
- django学习
- 学习django
- Django 学习
- Django学习
- Django 学习
- django学习
- Django 学习
- django学习
- Django学习
- Django学习
- django学习
- Django学习
- Django学习
- django学习
- django学习
- Django学习
- Django 学习
- ExtJS与JQuery对比
- OpenERP Server Developers Documentation之Ir Actions
- Introduction to "s3c6410 LED" driver
- Error in an XML file: aborting build
- 杭电 Rank
- Django学习1.0
- 关于URL Scheme
- TextView控件上添加表情图片
- /hdu 1030 Delta-wave (建坐标找最小步骤路径)
- 排列组合的递归
- struts1工作原理
- 多线程静态方法同步
- 一些收藏
- 谋哥:App自推广这个概念就由我来创立了!