django 基础学习2
2016-08-19 19:13
429 查看
Django QuerySet API
从数据库中查询出来的结果一般是一个集合,这个集合叫做 QuerySet。python mange.py startapp blogsettings.py
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'paiming', 'learn', "calc", "people", "blog",blog/models.py
#coding:utf-8 from __future__ import unicode_literals from django.db import models # Create your models here. class Blog(models.Model): name=models.CharField(max_length=100) tagline=models.TextField def __unicode__(self): return self.name class Author(models.Model): name=models.CharField(max_length=100) email=models.EmailField() def __unicode__(self): return self.name class Entry(models.Model): blog=models.ForeignKey(Blog) headline=models.CharField(max_length=100) body_text=models.TextField() pub=models.DateField() mod=models.DateField() author=models.ManyToManyField(Author) n_comments = models.IntegerField() n_pingbacks = models.IntegerField() rating = models.IntegerField() def __unicode__(self): return self.headline
python manage.py makemigrations python manage.py migratedjango数据库错误相关问题:django数据库错误相关问题 - 皮皮blog - 博客频道 - CSDN.NET http://blog.csdn.net/pipisorry/article/details/45727309 1. QuerySet 创建对象的方法
root@jiangwenhui-virtual-machine:~/PycharmProjects/untitled/jianggou# python manage.py shell Python 2.7.6 (default, Jun 22 2015, 18:00:18) [GCC 4.8.2] on linux2 Type "help", "copyright", "credits" or "license" for more information. (InteractiveConsole) >>> >>> from blog.models import Blog >>> b=Blog(name='你好',tagline='世界') >>> b.save() 一共有四种方法 # 方法 1 >>> from blog.models import Author >>> Author.objects.create(name='jiangwenhui',email='290070744@qq.com') <Author: jiangwenhui> >>> # 方法 2 >>> >>> twz=Author(name='jwh',email='290070744@qq.com') >>> twz.save() >>> # 方法 3 >>> >>> >>> abc=Author() >>> abc.name="jiang" >>> abc.email="290070744@qq.com" >>> # 方法 4,首先尝试获取,不存在就创建,可以防止重复 >>> >>> >>> Author.objects.get_or_create(name="alex",email="alex@qq.com") (<Author: alex>, True) >>> Author.objects.get_or_create(name="alex",email="alex@qq.com") (<Author: alex>, False) >>> # 返回值(object, True/False) #备注:前三种方法返回的都是对应的 object,最后一种方法返回的是一个元组,(object, True/False),创建时返回 True, 已经存在时返回 False当有一对多,多对一,或者多对多的关系的时候,先把相关的对象查询出来
root@jiangwenhui-virtual-machine:~/PycharmProjects/untitled/jianggou# python manage.py shell Python 2.7.6 (default, Jun 22 2015, 18:00:18) [GCC 4.8.2] on linux2 Type "help", "copyright", "credits" or "license" for more information. (InteractiveConsole) >>> from blog.models import Entry >>> from blog.models import Blog >>> entry = Entry.objects.get(pk=1) >>> cheese_blog = Blog.objects.get(name="jiangwenhui") >>> cheese_blog = Blog.objects.get(name="jwh") >>> cheese_blog = Blog.objects.get(name="alex") >>> cheese_blog = Blog.objects.get(name="abcd") >>> cheese_blog = Blog.objects.get(name="你好") >>> entry.blog = cheese_blog >>> entry.save() >>>2. 获取对象的方法
>>> >>> from people.models import person >>> person.objects.all()# 查询所有 <QuerySet [<person: jwh(25)>, <person: jiangwenhui(18)>, <person: alex(10)>, <person: aaa(1)>, <person: bbb(2)>]> >>> > >>> >>> >>> >>> person.objects.all()[:10]切片操作,获取10个人,不支持负索引,切片可以节约内存,不支持负索引 <QuerySet [<person: jwh(25)>, <person: jiangwenhui(18)>, <person: alex(10)>, <person: aaa(1)>, <person: bbb(2)>]> >>> >>> >>> person.objects.get(name='jwh') # 名称为 jwh 的一条,多条会报错 <person: jwh(25)> get是用来获取一个对象的,如果需要获取满足条件的一些人,就要用到filter >>> >>> >>> person.objects.filter(name='jwh')# 等于Person.objects.filter(name__exact="jwh") 名称严格等于 "abc" 的人 <QuerySet [<person: jwh(25)>]> >>> >>> person.objects.filter(name__iexact='jwh') <QuerySet [<person: jwh(25)>]> >>> Person.objects.filter(name__iexact="abc") # 名称为 abc 但是不区分大小写,可以找到 ABC, Abc, aBC,这些都符合条件 erson.objects.filter(name__contains="abc") # 名称中包含 "abc"的人 Person.objects.filter(name__icontains="abc") #名称中包含 "abc",且abc不区分大小写 Person.objects.filter(name__regex="^abc") # 正则表达式查询 Person.objects.filter(name__iregex="^abc")# 正则表达式不区分大小写 # filter是找出满足条件的,当然也有排除符合某条件的 Person.objects.exclude(name__contains="WZ") # 排除包含 WZ 的Person对象 Person.objects.filter(name__contains="abc").exclude(age=23) # 找出名称含有abc, 但是排除年龄是23岁的3. QuerySet 是可迭代的,比如:
>>> >>> >>> es=person.objects.all() >>> for i in es: ... print(i.name) ... jwh jiangwenhui alex aaa bbb >>> >>> es = Entry.objects.all() >>> for e in es: ... print(e.headline) ... 哈罗 >>> >>> >>> >>>Entry.objects.all() 或者 es 就是 QuerySet 是查询所有的 Entry 条目。注意事项:(1). 如果只是检查 Entry 中是否有对象,应该用 Entry.objects.all().exists()(2). QuerySet 支持切片 Entry.objects.all()[:10] 取出10条,可以节省内存(3). 用 len(es) 可以得到Entry的数量,但是推荐用 Entry.objects.count()来查询数量,后者用的是SQL:SELECT COUNT(*)(4). list(es) 可以强行将 QuerySet 变成 列表
Django 后台
一,新建一个 名称为 jianggou 的项目
django-admin.py startproject jianggou
二,新建一个 叫做 blogs 的app
# 进入 jianggou 文件夹 cd jianggou # 创建 blogs 这个 app python manage.py startapp blogs
三,修改 blogs 文件夹中的 models.py
#coding:utf-8 from __future__ import unicode_literals from django.db import models # Create your models here. class article(models.Model): biaoti=models.CharField(u"标题",max_length=50) neirong=models.TextField(u"内容") pubdate=models.DateTimeField(u"发表时间",auto_now_add=True,editable=True) updatetime=models.DateTimeField(u"更新时间",auto_now=True,null=True)
四,把 blogs 加入到settings.py中的INSTALLED_APPS中
INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'blogs', )
五,同步所有的数据表
root@jiangwenhui-virtual-machine:~/PycharmProjects/untitled/jianggou# python manage.py makemigrations System check identified some issues: WARNINGS: Migrations for 'blogs': blogs/migrations/0001_initial.py: - Create model article root@jiangwenhui-virtual-machine:~/PycharmProjects/untitled/jianggou# python manage.py migrate System check identified some issues: WARNINGS: ?: (mysql.W002) MySQL Strict Mode is not set for database connection 'default' HINT: MySQL's Strict Mode fixes many data integrity problems in MySQL, such as data truncation upon insertion, by escalating warnings into errors. It is strongly recommended you activate it. See: https://docs.djangoproject.com/en/1.10/ref/databases/#mysql-sql-mode blog.Entry.author: (fields.W340) null has no effect on ManyToManyField. Operations to perform: Apply all migrations: admin, auth, blog, blogs, contenttypes, paiming, people, sessions Running migrations: Rendering model states... DONE Applying blogs.0001_initial... OK root@jiangwenhui-virtual-machine:~/PycharmProjects/untitled/jianggou#如果是 Django 不主动提示创建管理员,用下面的命令创建一个帐号
python manage.py createsuperuser
六,修改 admin.py
进入 blogs 文件夹,修改 admin.py 文件(如果没有新建一个),内容如下from django.contrib import admin # Register your models here. from .models import article admin.site.register(article)
七,打开 开发服务器
python manage.py runserver # 如果提示 8000 端口已经被占用,可以用 python manage.py runserver 8001 以此类推访问 http://localhost:8000/admin/ 输入设定的帐号和密码, 就可以看到:点击 Articles,动手输入 添加几篇文章,就可以看到:我们会发现所有的文章都是叫 Article object,这样肯定不好,比如我们要修改,如何知道要修改哪个呢?我们修改一下 blog 中的models.py
#coding:utf-8 from __future__ import unicode_literals from django.db import models # Create your models here. class article(models.Model): biaoti=models.CharField(u"标题",max_length=50) neirong=models.TextField(u"内容") pubdate=models.DateTimeField(u"发表时间",auto_now_add=True,editable=True) updatetime=models.DateTimeField(u"更新时间",auto_now=True,null=True)def __unicode__(self):# 在Python3中用 __str__ 代替 __unicode__return "{}({})".format(self.biaoti,self.pubdate)我们加了一个 __unicode__ 函数,刷新后台网页,会看到:所以推荐定义 Model 的时候 写一个 __unicode__ 函数(或 __str__函数)
八,在列表显示与字段相关的其它内容
admin.pyfrom django.contrib import admin # Register your models here. from .models import article class info1(admin.ModelAdmin): list_display = ('biaoti','neirong','pubdate','updatetime') admin.site.register(article,info1)list_display 就是来配置要显示的字段的,当然也可以显示非字段内容,或者字段相关的内容,比如:
#coding:utf-8 from __future__ import unicode_literals from django.db import models # Create your models here. class article(models.Model): biaoti=models.CharField(u"标题",max_length=50) neirong=models.TextField(u"内容") pubdate=models.DateTimeField(u"发表时间",auto_now_add=True,editable=True) updatetime=models.DateTimeField(u"更新时间",auto_now=True,null=True)def __unicode__(self):return "{}({})".format(self.biaoti,self.pubdate)class person(models.Model):first_name=models.CharField(max_length=30)last_name=models.CharField(max_length=30)def my(self):return "{}{}".format(self.first_name,self.last_name)my.short_description = "Full name of the person"fullname=property(my)在admin.py中
from django.contrib import admin # Register your models here. from .models import article,person class info1(admin.ModelAdmin): list_display = ('biaoti','neirong','pubdate','updatetime') admin.site.register(article,info1) class info2(admin.ModelAdmin): list_display = ("fullname",) admin.site.register(person,info2)
python manage.py makemigrations python manage.py migrate
Django 表单
有时候我们需要在前台用 get 或 post 方法提交一些数据,所以自己写一个网页,用到 html 表单的知识。写一个计算 a和 b 之和的简单应用,网页上这么写<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>index</title> </head> <body> <p>请输入两个数字</p> <form action="/add/" method="get"> a:<input type="text" name="a"> <hr> b:<input type="text" name="b"> <br> <input type="submit" value="提交"> </form> </body> </html>把这些代码保存成一个index.html,放在 templates 文件夹中。网页的值传到服务器是通过 <input> 或 <textarea>标签中的 name 属性来传递的,在服务器端这么接收:
#coding:utf-8 from django.shortcuts import render from django.http import HttpResponse # Create your views here. def add_test(request): a=request.GET['a'] b=request.GET['b'] return HttpResponse("{}+{}={}".format(float(a),float(b),float(a)+float(b))) def index_test(request): return render(request,'index.html')request.GET 可以看成一个字典,用GET方法传递的值都会保存到其中,可以用 request.GET.get('key', None)来取值,没有时不报错。再将函数和网址对应上,就可以访问了:
"""jianggou URL Configuration The `urlpatterns` list routes URLs to views. For more information please see: https://docs.djangoproject.com/en/1.10/topics/http/urls/ Examples: Function views 1. Add an import: from my_app import views 2. Add a URL to urlpatterns: url(r'^$', views.home, name='home') Class-based views 1. Add an import: from other_app.views import Home 2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home') Including another URLconf 1. Import the include() function: from django.conf.urls import url, include 2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls')) """ from django.conf.urls import url from django.contrib import admin from learn import views as learn from calc import views as calc from blogs import views as blogs urlpatterns = [ url(r'^admin/', admin.site.urls), url(r"^$",learn.index), url(r"^add/",blogs.add_test), url(r"^add2/(\d+)/(\d+)",calc.add2,name='add2'), url(r"^new_add2/(\d+)/(\d+)",calc.add2,name='add2'), url(r"^home/",learn.home), url(r"^home1/",learn.home1), url(r"^home2/",learn.home2), url(r"^home3/",learn.home3), url(r"^index/",blogs.index_test), ]使用 Django 的 表单 (forms):
# 进入到 项目 文件夹,新建一个 tools APP python manage.py startapp tools在tools文件夹中新建一个 forms.py 文件
#/usr/bin/env python #coding:utf-8 from django import forms class addform(forms.Form): a=forms.IntegerField() b=forms.IntegerField()视图函数 views.py 中
#/usr/bin/env python #coding:utf-8 from django.shortcuts import render # Create your views here. from django.http import HttpResponse # 引入我们创建的表单类 from .forms import addform def index(request): if request.method=='POST':# 当提交表单时 form=addform(request.POST) # form 包含提交的数据 if form.is_valid():# 如果提交的数据合法 a=form.cleaned_data['a'] b=form.cleaned_data['b'] return HttpResponse("{}+{}={}".format(float(a),float(b),float(a)+float(b))) else:# 当正常访问时 form=addform return render(request,'index.html',{"form":form})对应的模板文件 index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>index</title> </head> <body> <form method="post"> {% csrf_token %} {{ form }} <input type="submit" value="提交"> </form> </body> </html>再在 urls.py 中对应写上这个函数
from tools import views as tools urlpatterns = [ url(r'^admin/', admin.site.urls), url(r"^$",tools.index,name='home'),
Django 配置
运行 django-admin.py startproject [project-name] 命令会生成一系列文件,在Django 1.6版本以后的 settings.py 文件中有以下语句:TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [ os.path.join(BASE_DIR,'templates').replace('\\', '/'), os.path.join(BASE_DIR,'templates2').replace('\\', '/'), ], 'APP_DIRS': True, ]这样 就可以把模板文件放在 templates 和 templates2 文件夹中了。
Django 静态文件静态文件是指 网站中的 js, css, 图片,视频等文件settings.py 静态文件相关示例代码及说明:# Static files (CSS, JavaScript, Images)# https://docs.djangoproject.com/en/1.8/howto/static-files/ STATIC_URL = '/static/'# 当运行 python manage.py collectstatic 的时候# STATIC_ROOT 文件夹 是用来将所有STATICFILES_DIRS中所有文件夹中的文件,以及各app中static中的文件都复制过来# 把这些文件放到一起是为了用apache等部署的时候更方便STATIC_ROOT = os.path.join(BASE_DIR, 'collected_static')# 其它 存放静态文件的文件夹,可以用来存放项目中公用的静态文件,里面不能包含 STATIC_ROOT# 如果不想用 STATICFILES_DIRS 可以不用,都放在 app 里的 static 中也可以STATICFILES_DIRS = (os.path.join(BASE_DIR, "common_static"),'/path/to/others/static/', # 用不到的时候可以不写这一行)# 这个是默认设置,Django 默认会在 STATICFILES_DIRS中的文件夹 和 各app下的static文件夹中找文件# 注意有先后顺序,找到了就不再继续找了STATICFILES_FINDERS = ("django.contrib.staticfiles.finders.FileSystemFinder","django.contrib.staticfiles.finders.AppDirectoriesFinder") |
dj18static├── blog│ ├── __init__.py│ ├── admin.py│ ├── migrations│ │ └── __init__.py│ ├── models.py│ ├── static # 应用 blog 下的 static, 默认会找这个文件夹│ │ └── 【zqxt.png】│ ├── tests.py│ ││ └── views.py├── common_static # 已经添加到了 STATICFILES_DIRS 的文件夹│ └── js│ └── 【jquery.js】│├── dj18static│ ├── __init__.py│ ├── settings.py│ ├── urls.py│ └── wsgi.py└── manage.py当 settings.py 中的 DEBUG = True 时,打开开发服务器 python manage.py runserver 直接访问 /static/zqxt.png 就可以找到这个静态文件。也可以在 settings.py 中指定所有 app 共用的静态文件,比如 jquery.js 等
STATICFILES_DIRS = (os.path.join(BASE_DIR, "common_static"),)把 jquery.js 放在 common_static/js/ 下,这样就可以 在 /static/js/jquery.js 中访问到它!当然也可以自己指定静态文件夹, 在urls.py的最后边这样写
# static filesimport osfrom django.conf.urls.static import staticfrom django.conf import settingsif settings.DEBUG:media_root = os.path.join(settings.BASE_DIR,'media2')urlpatterns += static('/media2/', document_root=media_root)也可以这样
from django.conf.urls.static import staticurlpatterns = patterns('',url(r'^$', 'app.views.index', name='index'),url(r'^admin/', include(admin.site.urls)),) + static('/media2/', document_root=media_root)
部署时
1. 收集静态文件python manage.py collectstatic2. 用 apache2 或 nginx 示例代码apache2配置文件
Alias /static/ /path/to/collected_static/<Directory /path/to/collected_static>Require all granted</Directory>nginx 示例代码:
location /media {alias /path/to/project/media;}location /static {alias /path/to/project/collected_static;}Apache 完整的示例代码:
<VirtualHost *:80>ServerName www.ziqiangxuetang.comServerAlias ziqiangxuetang.comServerAdmin tuweizhong@163.comAlias /media/ /path/to/media/Alias /static/ /path/to/collected_static/<Directory /path/to/media>Require all granted</Directory><Directory /path/to/collected_static>Require all granted</Directory>WSGIScriptAlias / /path/to/prj/prj/wsgi.py<Directory /path/to/prj/prj><Files wsgi.py>Require all granted</Files></Directory></VirtualHost>
相关文章推荐
- Django基础学习之Cookie 和 Sessions 应用
- DJANGO基础学习之模板过滤备忘
- 深入学习Django源码基础15 - views简要分析学习
- DJANGO基础学习之request对象和response对象
- [python]Django学习笔记(基础)
- DJANGO基础学习之request对象和response对象
- Django基础学习<1>
- 深入学习Django源码基础13 - Django中的中间件(middleware)
- 深入学习Django源码基础12 - 简要分析Django中template模块2
- Django学习笔记(一)环境搭建基础教程示例
- DJANGO基础学习之数据库操作
- 深入学习Django源码基础5 - utils中archive技巧
- 深入学习Django源码基础4 - python的动态延时加载技术(lazy)
- 深入学习Django源码基础14 - Django中forms简要分析
- 深入学习Django源码基础9 - 简单分析DjangoORM部分
- DJANGO基础学习之QuerySet的select_related()函数
- 深入学习Django源码基础3 - python提供的对象默认方法
- 深入学习Django源码基础7 - python的gettext国际化本地化
- 深入学习Django源码基础17 - django中messagee分析学习
- Django 学习 1 基础概念