版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_30162859/article/details/82156199
1. 入门
1.1 虚拟环境
pip install virtualenv
pip instal virtualenvwrapper-win
可以自己设置一个 WORKON_HOME
的环境变量, 这样虚拟环境就全部都会安装在该目录中。
# 常用命令
mkvirtualenv 环境名 #创建
mkvirtualenv [mkvirtualenv-options] [virtualenv-options] <name>
lsvirtualenv # 列出所有已安装虚拟环境
rmvirtualenv 环境名 # 删除
workon 环境名 # 激活环境
deactivate # 退出激活
1.2 查看版本
import django
django.get_version()
1.3 创建项目
django-admin startproject 项目名
项目名中的目录
--demo1
-----demo1 # 这是一个模块,如果想加新的功能,就新增加一个模块就好
--------__init__.py # 空文件,表示模块
--------settings.py # 项目的配置
--------urls.py # 项目的URL声明
--------wsgi.py # 项目与WSGI兼容的web服务器入口,部署时候用
-----manage.py # 命令行工具,通过它可以使用多种方式对项目交互
settings.py中已经配置好了默认使用sqlite3数据库
1.4 创建应用app
创建一个app,在其中设计模型,以完成和数据库的交互。
python manage.py startapp booktest
app的目录结构
--booktest
----migrations # 数据库迁移文件保存的文件夹
------__init__.py
----__init__.py
----admin.py #
----app.py #
----models.py # 定义模型类
----tests.py # 自带测试模块
----views.py # 视图定义文件
模板文件夹还没有创建
1.5 注册app
把引用注册到 installed_apps中:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'booktest.apps.BooktestConfig'
]
1.6 设计models
在booktest/models.py中设计python类:
from django.db import models
# 自己定义类
class BookInfo(models.Model):
"""不需要创建id,会自动维护"""
btitle = models.CharField(max_length = 20) # 必须是models中提供的数据类型
bpub_date = models.DateTimeField()
def __str__(self): # 没有修改models的数据库结果,可以不用迁移
return f'书名为:{self.btitle}'
class HeroInfo(models.Model):
hname = models.CharField(max_length = 10)
hgender = models.BooleanField()
hcontent = models.CharField(max_length = 1000)
hbook = models.ForeignKey(BookInfo, on_delete= models.CASCADE) # 引用对象,数据库中会自动使用外键, 从django 2.0开始,要指定 on_delete
1.7 迁移
- 根据所定义的model生成迁移文件
python manage.py makemigrations
- 根据迁移文件执行生成数据库
python mange.py migrate
1.8 使用命令行测试
python mange.py shell
from booktest.models import *
>>> from booktest.models import BookInfo
>>> b = BookInfo()
>>> b.btitle = 'hhs'
>>> from datetime import *
>>> b.bpub_date = datetime(year = 1999,month = 12, day = 10)
>>> b.save()
>>> BookInfo.objects .all() # 返回了结果
<QuerySet [<BookInfo: 书名为:hhs>]>
b.delete() # 删除
b = BookInfo.objects.get(pk = 1) # 根据主键查找
b = BookInfo.objects.get(btitle = 'hhs' )
b.btitle = sdsd
b.save() # 修改
1.9 管理
创建管理员
python manage.py createsuperuser
运行项目
python manage.py runserver 8080
进入管理界面
访问本地端口/admin
更改文字显示中文
在settings.py中修改:
LANGUAGE_CODE = 'zh-hans' #'en-us'
TIME_ZONE = 'Asia/Shanghai'
注册模型到管理页面
booktest/admin.py:
from django.contrib import admin
from .models import *
# Register your models here.
admin.site.register(BookInfo)
刷新管理页面,可以对这个类的数据进行CRUD
自定义管理页面
django提供了admin.ModelAdmin
类,通过定义其子类,来定义模型在Admin界面中的显示方式:
class BookInfoAdmin(admin.ModelAdmin):
list_display = ['id','btitle','bpub_date']
list_per_page = 5
list_filter = ['btitle']
search_fields = ['btitle']
# 添加/修改页面的属性分组
fieldsets = [
(组名1, {'fields':[字段名]}),
(组名2, {'fields':[字段名]}),
]
admin.site.register(BookInfo, BookInfoAdmin)
关联对象同时注册
class HeroInfoInline(admin.StackedInline): # 除了StackedInline还有其他显示方式
model = HeroInfo
extra = 2
class BookInfoAdmin(admin.ModelAdmin):
inlines = [HeroInfoInline]
admin.site.register(BookInfo, BookInfoAdmin)
1.10 视图
booktest的app中的views.py,里面写函数用于处理请求返回响应
def index():
return HttpResponse("hello world")
settings.py中已经指定了url的根配置文件:
ROOT_URLCONF = 'test1.urls'
需要在项目模块的 urls.py中加入 app的url:
from django.contrib import admin
from django.urls import path,include
from booktest.views import index
urlpatterns = [
path('admin/', admin.site.urls),
path('', index),
path('booktest/', include('booktest.urls'))
]
app中创建urls.py文件,在其中写路由规则:
from django.urls import path
from .views import *
urlpatterns = [
path('', index )
]
1.11 使用模板
模板位置:
和manage.py同级,创建templates
文件夹,在其中创建 和app同名文件夹,里面写模板
配置模板路径
在settings.py 中的 TEMPLATES中的DIRS里面配置模板路径
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR,'templates') ], # 编写路径位置
硬编码写模板
from django.http import HttpResponse
from django.template import RequestContext, loader
# Create your views here.
def index(*args):
temp = loader.get_template('booktest/index.html') # 读取模板
return HttpResponse(temp.render()) # 返回视图结果
简化写法
from django.shortcuts import render
# Create your views here.
def index(request):
return render(request, 'booktest/index.html')
1.12 模板传递数据
在render方法中,传递第三个参数,类型为dict
:
from models import *
def index(request):
allbooks = BookInfo.objects.all() # 从model中获取数据
context = {'title':'hello','list':allbooks} # 创建传值字典
return render( request, 'booktest/index.html', context)
模板中挖坑:
{{ title}}
{%for book in list %}
<li>{{book}}</li>
{%endfor%}
1.13 从请求中获取参数
添加超链接:
{% for b in books %}
<li><a href="show/{{ b.id }}">{{ b }}</a></li>
{% endfor %}
创建新的view:
def show(request,id):
book_detail = BookInfo.objects.get(pk = id)
context = {'book': book_detail, 'heros': book_detail.heroinfo_set.all() ,'count': book_detail.heroinfo_set.count()}
return render(request, 'booktest/show.html',context)
创建对应的template:
<table>
<tr>
<td>{{ book.id }}</td>
<td>{{ book.btitle }}</td>
<td>{{ book.bpub_date }}</td>
{% for h in heros %}
<td>{{ h.hname }}</td>
{% endfor %}
</tr>
</table>
创建对应的url:
path('show/', include('booktest.urls'))
path('<id>', show) # 获取参数