django的工程创建和基础配置
工程创建和数据库
创建工程
$ django-admin.py startproject firstweb
创建之后目录结构如下
firstweb
├── firstweb
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
└── manage.py
manage.py用于创建app,相当于一个管理者.settings中包含工程的配置设置, urls中 设置主要的路由。,WSGI就像是一座桥梁,一边连着web服务器,另一边连着用户的应用。但是呢,这个桥的功能很弱,有时候还需要别的桥来帮忙才能进行处理
$ ./manage.py startapp booksite
.
├── booksite
│ ├── __init__.py
│ ├── models.py
│ ├── tests.py
│ └── views.py
├── firstweb
│ ├── __init__.py
│ ├── __init__.pyc
│ ├── settings.py
│ ├── settings.pyc
│ ├── urls.py
│ └── wsgi.py
└── manage.py
创建模型 该模型中的类对应着表 属性对应着字段
1 from django.db import models
2
3 # Create your models here.
4
5
6 class BookInfo(models.Model):
7 btitle = models.CharField(max_length=10)
8 bpub_date = models.DateTimeField()
9
10 class HeroInfo(models.Model):
11
12 hname = models.CharField(max_length=10)
13 hgender = models.BooleanField()
14 hcontent = models.CharField(max_length=100)
15 hBook = models.ForeignKey(BookInfo)
设计好之后 可以按照表转为 sql语句 准备创建
./manage.py makemigrations
创建迁移之后 就按照迁移 创建数据库
./manage.py migrate
Running migrations:
Rendering model states... DONE
Applying contenttypes.0001_initial... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0001_initial... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying sessions.0001_initial... OK
Applying sites.0001_initial... OK
就产生了bookdb数据库, 这个名字在setting中设置, 数据库类型也在setting中可以设置
.
├── bookdb
├── booksite
│ ├── __init__.py
│ ├── models.py
│ ├── tests.py
│ └── views.py
├── firstweb
│ ├── __init__.py
│ ├── __init__.pyc
│ ├── settings.py
│ ├── settings.pyc
│ ├── urls.py
│ └── wsgi.py
└── manage.py
通过shell可以在 命令行中创建 添加数据
./manage.py shell
>>> from booksite.models import *
>>>
>>>
>>>
>>> b = BookInfo()
>>> b.btitle = '天龙八部'
>>>
>>> from datetime import datetime
>>> b.bpub_date = datetime(2012,10,1)
>>> b.save()
>>> h = HeroInfo()
>>> h.hname = '乔峰'
>>> h.hgender = True
>>> h.hcontent = '降龙十八掌'
>>> h.hBook = b
>>> h.save()
h.hBook = b之后
b中就有一个heroinfo_set 这个集合中保存着 所有的 被引用到了那些英雄。
实质是在 把自己的id主键 赋值给 hero了。也就算是说hero引用了book主键
可以在这个集合中直接添加,不需要再一个个绑定了
整个对象作为外键 也可以快速绑定,自动把b的主键id给创建的新对象
>>> b.heroinfo_set.create(hname='虚竹',hgender=True, hcontent='北冥神功')
<HeroInfo: HeroInfo object>
##后台admin管理
主要步骤
- 创建超级管理员
python manage.py createsuperuser
- 到app目录下 注册 admin.site.register(class)
登陆 admin就可以访问了
但是界面中没有我们的两个表 需要注册
到app下的 admin.py中 注册控制显示效果
1 from django.contrib import admin
2 from models import *
3 # Register your models here.
4 #控制内嵌
5 class HeroInline(admin.StackedInline):
6 model = HeroInfo
7 extra = 2
8 #控制显示字段 和内嵌显示
9 class BookAdmin(admin.ModelAdmin):
10 inlines = [HeroInline]
11 list_display = ['btitle', 'bpub_date']
12 class HeroAdmin(admin.ModelAdmin):
13 list_display = ['id', 'hname', 'gender']
14 #注册类 显示 gender是一个方法 可以用models的返回值作为显示值
15 admin.site.register(BookInfo, BookAdmin)
16 admin.site.register(HeroInfo, HeroAdmin)
内联2是在Book显示的时候 多显示两个hero添加而已
- 创建添加类 类中设置添加的类名 和个数
- 把这个添加类 绑定到需要的admin类中的inlines 中
- 样式中还有Tablur样式
利用admin中显示字段list_display = [方法, 字段]
方法的返回值就是显示的效果值
class HeroInfo(models.Model):
hname = models.CharField(max_length=20)
hcontent = models.CharField(max_length=100)
hgender = models.BooleanField()
hBook = models.ForeignKey(BookInfo)
def gender(self):
if self.hgender:
return '男'
else:
return '女'
def __str__(self):
return self.hname.encode('utf-8')
模板
模板注意的是新版的django 需要设置DIRS
到setting文件中
#这个是 setting文件的 文件夹, 的 文件夹 路径 , 也就是 工程大文件夹路径
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
根据已经有的BASE_DIR 拼接 模板路径
56 TEMPLATES = [
57 {
58 'BACKEND': 'django.template.backends.django.DjangoTemplates',
59 'DIRS': [os.path.join(BASE_DIR, 'templates')],
60 'APP_DIRS': True,
61 'OPTIONS': {
62 'context_processors': [
63 'django.template.context_processors.debug',
64 'django.template.context_processors.request',
65 'django.contrib.auth.context_processors.auth',
66 'django.contrib.messages.context_processors.messages',
67 ],
68 },
69 },
70 ]
##视图函数渲染
from django.shortcuts import render
from django.http import HttpResponse
#from django.template import RequestContext, loader
# Create your views here.
from models import *
def index(request):
alist = BookInfo.objects.all()
#t = loader.load('oneapp/index.html')
#context = RequestContext(request, {'list':alist})
# return HttpResponse(t.render(context))
return render(request, 'oneapp/index.html', {'list': alist})
- 两种方式都可以渲染 返回模板 后边的render 更加简单一点
##urls配置
参数传递 直接给视图函数的形参
比如输入’127.0.0.1:8000/1/‘
根据urls定位到 视图函数
工程url 主要起到大分类的作用
urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
url(r'', include('oneapp.urls')),
]
app中的url
urlpatterns = [
url(r'^$', views.index),
url(r'^([0-9]+)/$', views.detail),
]
数字1传入到了 aid中
def detail(request, aid):
book1 = BookInfo.objects.get(pk=aid)
return render(request, 'oneapp/detail.html', {'book': book1})
# return HttpResponse('%s'%aid)
注意:如果 出现migrations错误删除 文件夹 重新创建迁移