您的位置:首页 > 编程语言 > Go语言

django 基础学习2

2016-08-19 19:13 429 查看

Django QuerySet API

从数据库中查询出来的结果一般是一个集合,这个集合叫做 QuerySet。
python mange.py startapp blog
settings.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 migrate
django数据库错误相关问题: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.py
from 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 文件中有以下语句:
这里用到了python中一个神奇的变量 __file__ 这个变量可以获取到当前文件(包含这个代码的文件)的路径。os.path.dirname(__file__) 得到文件所在目录,再来一个os.path.dirname()就是目录的上一级,BASE_DIR 即为 项目 所在目录。我们在后面的与目录有关的变量都用它,这样使得移植性更强。
DEBUG=True 时,如果出现 bug 便于我们看见问题所在,但是部署时最好不要让用户看见bug的详情,可能一些不怀好心的人攻击网站,造成不必要的麻烦。
ALLOWED_HOSTS 允许你设置哪些域名可以访问,即使在Apache中绑定了,这里不允许的话,也是不能访问的。当 DEBUG=False 时,这个为必填项,如果不想输入,可以用 ALLOW_HOSTS = ['*'] 来允许所有的。
static 是静态文件所有目录,比如 jquery.js, bootstrap.min.css 等文件。一般来说我们只要把静态文件放在 APP 中的 static 目录下,部署时用 python manage.py collectstatic 就可以把静态文件收集到 STATIC_ROOT 目录,但是有时我们有一些共用的静态文件,这时候可以设置 STATICFILES_DIRS 另外弄一个文件夹,如下:
这样我们就可以把静态文件放在 common_static 和 /var/www/static/中了,Django也能找到它们。
media文件夹用来存放用户上传的文件,与权限有关,详情见 Django 静态文件Django 部署有时候有一些模板不是属于app的,比如 baidutongji.html, share.html等,
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")
静态文件放在对应的 app 下的 static 文件夹中 或者 STATICFILES_DIRS 中的文件夹中。当 DEBUG = True 时,Django 就能自动找到放在里面的静态文件。(Django 通过 STATICFILES_FINDERS 中的“查找器”,找到符合的就停下来,寻找的过程 类似于 Python 中使用 import xxx 时,找 xxx 这个包的过程)。示例项目 dj18static, 应用 app 下面有一个 static 里面有一个 zqxt.png 图片:
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 collectstatic
2. 用 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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Create future people