每日一记======>Django 2012.08.21
初步做一个django-powerd界面步骤:
-
#django.admin.py start project mysite 建立一个工程,工程名字里边的属于django的东西
-
在url窗口输入地址如/hello/ 进来的请求转入
-
manage.py 这个文件首先读的是setting.py这个设置文件,包括ROO_URLCONF等等
-
django 在URLconf中所有URL模式中,查找第一个匹配/hello/的条目。
-
找到匹配的话调用相应的视图,没有的话 返回默认。
-
视图函数返回一个HttpResponse
-
Djnago转换HttpResponse为一个适合的HTTP response,以web page 显示出来。
在建立的过程中,mysite中的urls中可以引入我们开启的app中的urls,只需要include('polls.urls') 即可, 同时将其复制到app中,在app中 修改这个urls文件,然后配置就可以了,注意syntax error 这个语法错误,即方法和include当中都要用单引号,还要注意复制的过程,一般自己建立的话会提示找不到polls。
URLconf中正则表达式的使用:
-
. 任意单一字符
-
\d 任意一位数字
-
+ 匹配一个或者更多
-
{1,3} 介于一个到三个之前的表达式 e.g. \d{1,3} 匹配一个或两个或者三个数字
-
[a-z] 任意其中一个字符
-
[^d]+ 一个或者多个不为d的字符
-
? 0个或者一个之前的表达式 \d? 匹配0个或者一个数字
-
* 0个或者更多
MODEL 模型———————————————————————————————————————————————————————————————————————————————
第一个应用程序:
Project和app的区别,一个是配置一个是代码:一个project包含多个django app以及对它们的配置。Project提供配置文件,比如哪里定义数据库连接,安装的app列表,TEMPLATE——DIRS等等。一个app是一套django功能的集合,通常包括模型和视图,按着Python包的结构方式存在。app的关键点是他们 可以移植到其他Project中被复用。如果建造一个许多不相关模块的复杂的网站,例如电子商务和社区之类的站点,需要把这些模块划分不同的app,以便以后复用。
系统对app有一个约定:如果你使用来django的数据库模型,必须建立一个django app。模型必须放在apps中。
在Python代码里边定义模型:
django模型是用python代码形式表述的数据在数据库中的定义,对数据库层面来说它等同于CREATE TABLE语句,只不过执行的是python代码而不是SQL,而且还包含了比数据库字段定义更多的含义。django用模型在后台执行SQL代码并把结果用Python的数据结构来描述。django也使用模型来呈现SQL无法处理的高级概念。
django提供了实用工具来从现有的数据库表中自动扫描生成模型。这对已有的数据库来说是非常快捷有用的。
每个模型相当于单个数据库表,每个属性也是这个表中的一个字段。属性名就是字段名,类型相当于数据库的字段类型。每个数据库表对应一个类“这条规则例外情况是多对多的关系”。例如,book有一个多对对字段,表明一本书籍有一个或者多个作者,但book数据库表并么没有authors字段。相反,django创建一个额外的表(多对多连接表)来处理书籍和作者之间的映射关系。我们并没有显示的为这些模型定义任何主键,django自动生成一个自增长的主键字段每个django模型都要求有单独的主键id。
syncdb 命令并不能将模型的修改或删除同步到数据库;如果修改或删除一个模型,并提交到数据库,syncdb不会做任何处理。
当我们打印publishe列表的时候没有得到有用的信息,需要添加方法__unicode__(), 这个方法告诉Python如何将对象以unicode方式显示出来。 可以进行任何处理来返回一个对象的字符串表示。必须返回一个unicode对象才行。unicode对象就是一个python字符串,可以处理不同类别的字符。
django的模型不只是为对象定义了数据库表的结构,还定义了对象的行为。
filter() 数据过滤 get()获取单个对象,结果是多个对象的话,会抛出异常,查询没有返回结果也会抛出异常;DoNotExist异常是publisher这个model类的一个属性,即,publisher.DoNotExist。在应用中可以捕获并且处理这个异常:
1 try: 2 p = Publisher.objects.get(name='Apress') 3 except Publisher.DoesNotExist: 4 print "Apress isn't in the database yet." 5 else: 6 print "Apress is in the database."
数据排序 :希望根据某个子段的值对检索结果排序,使用order_by(),publisher.objects.order_by("name") 如果多个子段为准进行排序,多加参数就行了。子段前边加鉴号的好是逆向排序。指定缺省的排序方式如下:
1 class Publisher(models.Model): 2 name = models.CharField(max_length=30) 3 address = models.CharField(max_length=50) 4 city = models.CharField(max_length=60) 5 state_province = models.CharField(max_length=30) 6 country = models.CharField(max_length=50) 7 website = models.URLField() 8 9 def __unicode__(self): 10 return self.name 11 12 **class Meta:** 13 **ordering = ['name']**
class Meta: ordering = ['name'] 内嵌于Publisher这个类中,要一定有缩进,用它来设定一些与特殊模型有关的选项。
连锁查询,链式的形式,publisher.objects.filter(country="usa").order_by("-name")
限制返回的数据:列表裁剪语句,例如,order_by('name')[0:2],但是不支持负索引。
更新多个对象,save方法会更新一行里边所有的列,某些情况只需要更新需要的列就行了。更改某一列,我们可以调用结果集(QuerySet)对象的update()方法: publisher.objects.filter(id=52).update(name = 'sdhhfisf') 这样就不会引起竞态条件。返回一个整数值,表示受影响的记录条数。
删除对象:delete() 调用对象的这个方法就行了。删除所有数据的时候要加上all(),删除部分的话,publisher.objects.filter(country='usa').delete()
手工录入数据的方法,django管理界面!!!
Django 站点管理———————————————————————————————————
管理界面有一个问题:创建它太繁琐,开发对公众的功能的时候,网页开发是有趣的,但是创建管理界面通常是千篇一律的。必须认证用户,显示并管理表格,验证输入的有效性等,很繁琐,是重复劳动。django的自动管理界面,它读取你模式中的元数据,然后提供给你一个强大而且可以使用的界面,网站管理者可以用它立即工作。
django.contrib包, 是一个庞大的功能集,django 基本代码的组成部分,django 框架就是由众多包含附加组件的基本代码构成的。与django捆绑在一起,可以看作是可选的Python标准库的实际实现。django自带的优秀组件,都在django.contrib中。
python manage.py createsuperuser 创建超级用户。
1 Exception Type: DatabaseError 2 Exception Value: 3 no such column: books_publisher.website
websit 是列名,当初写的时候,应该写website ,但是同步以后再修改发现,出现了这种错误,所以,这个时候。怎么修改列名?????????