@nemos
2017-05-06T02:34:40.000000Z
字数 4136
阅读 837
web
查看版本
django-admin --version #查看版本
django-admin startproject mysite #创建项目
django-admin.py startapp app-name #创建app
python manage.py startapp appname #创建app
python 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 HttpResponse
def 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 render
def 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 makemigrations
python manage.py migrate
from django.db import models
class 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() #获取所有对象,返回一个QuerySet
Person.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 forms
class AddForm(forms.Form):
a = forms.IntegerField()
b = forms.IntegerField()
views.py
from django.shortcuts import render
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(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 os
BASE_DIR = os.path.dirname(os.path.dirname(__file__)) #指向了当前项目的根目录
DEBUG = True #debug选项
TEMPLATE_DEBUG = True
ALLOWED_HOSTS = [] #指定允许访问的域名,当DEBUG为False时必填, ['*']允许所有
STATIC_URL = '/static/' #静态文件url
STATIC_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,]