@nemos
        
        2017-05-06T02:34:40.000000Z
        字数 4136
        阅读 876
    web
查看版本
django-admin --version #查看版本django-admin startproject mysite #创建项目django-admin.py startapp app-name #创建app
python manage.py startapp appname #创建apppython manage.py makemigrations #创建表python manage.py migrate #数据迁移与同步python manage.py flush #清空数据库python manage.py dumpdata appname > appname.json #导出数据python manage.py loaddata appname.json #导入数据python manage.py runserver 8000 #运行服务python manage.py shell #项目终端环境python manage.py dbshell #数据库命令行
创建app 
一个项目可以有多个app 
python manage.py startapp appname创建app 
在site/settings的INSTALLED_APPS中添加appname 
添加app可以保证django可以找到app的模板和静态文件
目录层次 
创建的
mysite├── manage.py└── mysite├── __init__.py├── settings.py├── urls.py└── wsgi.py
本文所用的
project├── manage.py└── site├── __init__.py├── settings.py├── urls.py└── wsgi.py
url.py 
转发url请求到视图函数
from app import views as app_view #注意使用方式urlpatterns = [url(r'^$', app_views.index, name='index'),]#转发url请求,name为url的别名可以在模板渲染中使用
view.py 
响应一个Url请求 
简单创建
from django.http import HttpResponsedef index(request):return HttpResponse('test')
视图函数的第一个参数必须为request包含了get和post请求的内容
request.GET #返回get接受到的参数的字典
django默认会在app的目录下的templates文件夹为根目录中找模板 
但会遍历所有的app下的templates 
render(request, 'home.html') 
.../templates/home.html
视图函数中的渲染语句
from django.shortcuts import renderdef view(request):return render(request, 'xxx.html', {'string': string})
# 字符替换render(request, 'xxx.html', {'string': string}){{ string }}# 列表循环xlist = ["HTML", "CSS", "jQuery", "Python", "Django"]render(request, 'xxx.html', {'xlist': xlist}){% for ele in xlist %}{{ ele }}{% endfor %}# 字典映射xdict = {'site': 'www'}render(request, 'xxx.html', {'xdict': xdict})This site is {{ xdict.site }}# 字典遍历{% for key, value in xdict.items %}{{ key }}: {{ value }}{% endfor %}# 判断是否到最后一项{% for item in list %}{{ item }}{% if not forloop.last %},{% endif %}{% endfor %}# 可能为空的情况<ul>{% for athlete in athlete_list %}<li>{{ athlete.name }}</li>{% empty %}<li>抱歉,列表为空</li>{% endfor %}</ul>
特殊循环变量 
|变量|描述| 
|forloop.counter|索引1| 
|forloop.counter0|索引0| 
|forloop.revcounter|1倒着索引| 
|forloop.revcounter0|0倒索引| 
|forloop.first|元素为第一项时为真| 
|forloop.last|最后一项时为真| 
|forloop.parentloop|获取上一层循环的forloop|
`<a href="{% url 'add2' 4 5 %}">link</a>``{% extends 'base.html' %}`
models.py
python manage.py makemigrationspython manage.py migrate
from django.db import modelsclass Person(models.Model): #定义了一张表name = models.CharField(max_length=30) #定义了一个字段def __str__(self): #方便查看return self.name
from app.models import Person #引入模型Person.objects.create(name=) #方法一p = Person(name=) #方法二p.save()p = Person() #方法三p.name =p.save()Person.objects.get_or_create(name=) #方法四# 返回(object, True/False),创建时返回True
Person.objects.all() #获取所有对象,返回一个QuerySetPerson.objects.all().order_by('name') #排序Person.objects.all().order_by('-name') #倒序Person.objects.all()[:10] #切片操作,节省内存,不支持负索引Person.objects.all().reverse()[:2] #实现负索引Person.objects.get(name=name) #条件索引,只能获取到一个Person.objects.all().exists() #查询对象是否存在Person.objects.filter(name=) #严格相等Person.objects.filter(name__exact=) #与上相同Person.objects.filter(name__contains=) #包含Person.objects.filter(name__regex=) #正则Person.objects.filter(name__iexact=) #方法都可以加i不区分大小写Person.objects.exclude(name__contains=) #排除Person.objects.filter(name__contains=).exclude(age=) #包含再排除
在app下创建forms.py
from django import formsclass AddForm(forms.Form):a = forms.IntegerField()b = forms.IntegerField()
views.py
from django.shortcuts import renderfrom django.http import HttpResponsefrom .forms import AddFormdef 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(str(int(a) + int(b)))else: #正常访问时form = AddForm()return render(request, 'index.html', {'form': form})
对应的模板文件 
index.html
<form method='post'>{% csrf_token %}{{ form }}<input type="submit" value="提交"></form>
import osBASE_DIR = os.path.dirname(os.path.dirname(__file__)) #指向了当前项目的根目录DEBUG = True #debug选项TEMPLATE_DEBUG = TrueALLOWED_HOSTS = [] #指定允许访问的域名,当DEBUG为False时必填, ['*']允许所有STATIC_URL = '/static/' #静态文件urlSTATIC_ROOT = os.path.join(BASE_DIR,'static') #收集静态文件时存储目录STATICFILES_DIRS = ( #添加静态文件存储目录os.path.join(BASE_DIR, "common_static"),'/path/to/others/static/', # 用不到的时候可以不写这一行)TEMPLATES = [ #添加模板目录{ #用于公用模板的情况'BACKEND': 'django.template.backends.django.DjangoTemplates','DIRS': [os.path.join(BASE_DIR,'templates').replace('\\', '/'),],'APP_DIRS': True,]