pip install Django==3.0.2
安装django后,得到django-admin管理工具,它可以为新项目创建模板布局或将应用程序添加到现有项目
django-admin
查看django安装版本
django-admin version
python -m django --version
查看所安装的软件版本
pip freeze
查看所有的软件包
pip list
安装Django后,您可以使用以下命令创建项目(.代表不会出现文件夹名嵌套,不建议使用.)
django-admin startproject HelloWorld .
trydjango 项目文件夹
|-- HelloWorld 项目的容器
| |-- __init__.py 一个空文件,告诉 Python 该目录是一个 Python 包。
| |-- settings.py 该 Django 项目的设置/配置。
| |-- urls.py 该 Django 项目的 URL 声明; 一份由 Django 驱动的网站"目录"。
| `-- wsgi.py 一个 WSGI 兼容的 Web 服务器的入口,以便运行你的项目。
|--db.sqlite3 sqlite3数据库文件
`-- manage.py 一个实用的命令行工具,可让你以各种方式与该 Django 项目进行交互。
启动开发服务器(需要在有manage.py的目录下运行)
python manage.py runserver
端口号默认为 8000,使用Web浏览器访问http://127.0.0.1:8000/验证
页面出现The install worked successfully! Congratulations!即表示安装成功
此命令可在端口8080上启动服务器,0.0.0.0 让其它电脑可连接到开发服务器
python manage.py runserver 0.0.0.0:8080
要创建应用程序,请确保您与manage.py位于同一目录中,cd trydjango
在新增终端里输入
python manage.py startapp blog
trydjango
|-- blog 应用
| |--migrations
| `-- __init__.py
| |-- __init__.py
| |-- admin.py
| |-- apps.py
| |-- models.py
| |-- tests.py
| `-- views.py
|
|-- HelloWorld
| |-- __init__.py
| |-- settings.py
| |-- urls.py
| `-- wsgi.py
|--db.sqlite3
`-- manage.py
写第一个页面(视图)。打开文件trydjango/blog/views.py
from django.http import HttpResponse
def index(request):
return HttpResponse("Hello, world. You're at the blog index.")
也可以这样写
from django.shortcuts import render
def index(request):
context = {}
context['hello'] = 'Hello World!'
return render(request, 'blog/hello.html', context)
可以看到,我们这里使用 render 来替代之前使用的 HttpResponse。render 还使用了一个字典 context 作为参数。
context 字典中元素的 "hello"键值 对应了模板中的变量 "{{ hello }}"
编辑 trydjango\HelloWorld\settings.py 文件前,
安装Django后,您可以使用以下命令创建项目(.代表不会出现文件夹名嵌套,不建议使用.)
django-admin startproject HelloWorld .
trydjango 项目文件夹
|-- HelloWorld 项目的容器
| |-- __init__.py 一个空文件,告诉 Python 该目录是一个 Python 包。
| |-- settings.py 该 Django 项目的设置/配置。
| |-- urls.py 该 Django 项目的 URL 声明; 一份由 Django 驱动的网站"目录"。
| `-- wsgi.py 一个 WSGI 兼容的 Web 服务器的入口,以便运行你的项目。
|--db.sqlite3 sqlite3数据库文件
`-- manage.py 一个实用的命令行工具,可让你以各种方式与该 Django 项目进行交互。
启动开发服务器(需要在有manage.py的目录下运行)
python manage.py runserver
端口号默认为 8000,使用Web浏览器访问http://127.0.0.1:8000/验证
页面出现The install worked successfully! Congratulations!即表示安装成功
此命令可在端口8080上启动服务器,0.0.0.0 让其它电脑可连接到开发服务器
python manage.py runserver 0.0.0.0:8080
要创建应用程序,请确保您与manage.py位于同一目录中,cd trydjango
在新增终端里输入
python manage.py startapp blog
或
django-admin startapp blog
trydjango
|-- blog 应用
| |--migrations
| `-- __init__.py
| |-- __init__.py
| |-- admin.py
| |-- apps.py
| |-- models.py
| |-- tests.py
| `-- views.py
|
|-- HelloWorld
| |-- __init__.py
| |-- settings.py
| |-- urls.py
| `-- wsgi.py
|--db.sqlite3
`-- manage.py
写第一个页面(视图)。打开文件trydjango/blog/views.py
from django.http import HttpResponse
def index(request):
return HttpResponse("Hello, world. You're at the blog index.")
也可以这样写
from django.shortcuts import render
def index(request):
context = {}
context['hello'] = 'Hello World!'
return render(request, 'blog/hello.html', context)
可以看到,我们这里使用 render 来替代之前使用的 HttpResponse。render 还使用了一个字典 context 作为参数。
context 字典中元素的 "hello"键值 对应了模板中的变量 "{{ hello }}"
依次新增文件夹,在trydjango\blog\templates\blog中创建hello.html文件
trydjango
|-- blog
| |--templates
| |--blog
| `--hello.html
`
编辑trydjango\blog\templates\blog\hello.html,添加
<h1>{{ hello }}</h1>
绑定URL与视图函数
在blog目录中创建URLconf,代码可参考trydjango\HelloWorld\urls.py,在trydjango\blog\路径下创建一个名为urls.py
trydjango
|-- blog 应用
| | :
| |-- urls.py
|
|-- HelloWorld
| :
| |-- urls.py
|
`
该trydjango\blog\urls.py文件中包含以下代码:
from django.urls import path
from blog import views
urlpatterns = [
path('', views.index, name='blog-index'),
]
Django path()函数可以接收四个参数,分别是两个必选参数:route、view 和两个可选参数:kwargs、name。
语法格式:
path(route, view, kwargs=None, name=None)
route: 字符串,表示 URL 规则,与之匹配的 URL 会执行对应的第二个参数 view。
view: 用于执行与正则表达式匹配的 URL 请求。
kwargs: 视图使用的字典类型的参数。
name: 用来反向获取 URL。
将根URLconf指向blog.urls模块。在trydjango\HelloWorld\urls.py中添加
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path('blog/', include('blog.urls')),
path('admin/', admin.site.urls),
]
激活应用
trydjango
|-- blog
| |--templates
| |--blog
| `--hello.html
`
编辑trydjango\blog\templates\blog\hello.html,添加
<h1>{{ hello }}</h1>
绑定URL与视图函数
在blog目录中创建URLconf,代码可参考trydjango\HelloWorld\urls.py,在trydjango\blog\路径下创建一个名为urls.py
trydjango
|-- blog 应用
| | :
| |-- urls.py
|
|-- HelloWorld
| :
| |-- urls.py
|
`
该trydjango\blog\urls.py文件中包含以下代码:
from django.urls import path
from blog import views
urlpatterns = [
path('', views.index, name='blog-index'),
]
Django path()函数可以接收四个参数,分别是两个必选参数:route、view 和两个可选参数:kwargs、name。
语法格式:
path(route, view, kwargs=None, name=None)
route: 字符串,表示 URL 规则,与之匹配的 URL 会执行对应的第二个参数 view。
view: 用于执行与正则表达式匹配的 URL 请求。
kwargs: 视图使用的字典类型的参数。
name: 用来反向获取 URL。
将根URLconf指向blog.urls模块。在trydjango\HelloWorld\urls.py中添加
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path('blog/', include('blog.urls')),
path('admin/', admin.site.urls),
]
激活应用
编辑 trydjango\HelloWorld\settings.py 文件前,
先设置LANGUAGE_CODE = 'zh-cn' 已改为 'zh-Hans'
TIME_ZONE 为你自己时区
https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
TIME_ZONE = 'Asia/Shanghai'
INSTALLED_APPS = (
'django.contrib.admin', 管理员站点
'django.contrib.auth', 认证授权系统
'django.contrib.contenttypes', 内容类型框架
'django.contrib.sessions', 会话框架
'django.contrib.messages', 消息框架
'django.contrib.staticfiles', 管理静态文件的框架
'blog.apps.BlogConfig', 添加此项,取自trydjango/blog/apps.py
)
trydjango/blog/apps.py文件内容如下:
from django.apps import AppConfig
class BlogConfig(AppConfig):
name = 'blog'
verbose_name = '博客' 别名,可用于汉化
编辑 trydjango/blog/models.py 文件
创建三个模型:类别Category、标签Tag和帖子Post
Django 要求模型必须继承 models.Model 类。
通过一个内嵌类“class Meta”给你的model定义元数据
模型的元数据,指的是“除了字段外的所有内容”,例如排序方式、数据库表名、人类可读的单数或者复数名等等
Meta类用来汉化,verbose_name(详细名称),plural(复数,带s时候会用到)
class Meta:
verbose_name = '别名'
verbose_name_plural = verbose_name
类中的__str__方法是在打印类的实例对象object()时,调用该方法,返回自定义字符串
def __str__(self):
return self.name
类别Category
Category 只需要一个简单的类别名 cname 就可以了。
CharField 指定了分类名 cname 的数据类型,CharField 是字符型,
CharField 必须加的 max_length 参数指定其最大长度,超过这个长度的分类名就不能被存入数据库。
标签Tag
只需要一个简单的标签名 tname
帖子Post
title 标题
content 正文使用了TextField来存储大段文本,存储比较短的字符串可以使用 CharField
created_time 创建时间,存储时间的字段用 DateTimeField 类型。
modified_time 最后一次修改时间,存储时间的字段用 DateTimeField 类型。
在这里把Post对应的数据库表和Category、Tag对应的数据库表关联了起来,但是关联形式稍微有点不同。
category 对于类别来说,一篇文章通常只能对应一个类别,但是一个类别下可以有多篇文章,
所以我们使用的是 ForeignKey,即一对多的关联关系。on_delete=models.CASCADE
ForeignKey 在后台中以选择框 <select> 的形式展示
tags 对于标签来说,一篇文章可以有多个标签,同一个标签下也可能有多篇文章,
所以我们使用 ManyToManyField,表明这是多对多的关联关系。
同时我们规定文章可以没有标签,因此为标签 tags 指定了 blank=True。
则trydjango/blog/models.py文件中包含以下代码
from django.db import models
from django.utils import timezone
# Create your models here.
class Category(models.Model):
cname = models.CharField(verbose_name='类别', max_length=20)
class Meta:
verbose_name = '类别'
verbose_name_plural = verbose_name
def __str__(self):
return self.cname
class Tag(models.Model):
tname = models.CharField(verbose_name='标签', max_length=20)
class Meta:
verbose_name = '标签'
verbose_name_plural = verbose_name
def __str__(self):
return self.tname
class Post(models.Model):
title = models.CharField(verbose_name='标题', max_length=100)
content = models.TextField(verbose_name='正文', default='')
created_time = models.DateTimeField(verbose_name='创建时间', default=timezone.now)
modified_time = models.DateTimeField(verbose_name='修改时间', auto_now=True)
is_published = models.BooleanField(verbose_name='是否发布', default=True)
category = models.ForeignKey(Category, verbose_name='类别', on_delete=models.CASCADE)
tags = models.ManyToManyField(Tag, verbose_name='标签', blank=True)
class Meta:
ordering = ['created_time']
verbose_name = '帖子'
verbose_name_plural = verbose_name
def __str__(self):
return self.title
迁移数据库
每当我们创建模型,删除模型或更新我们项目的任何models.py中的任何内容时。我们需要运行两个命令makemigrations和migrate。makemigrations基本上会为预安装的应用程序(可以在settings.py中的已安装应用程序中查看)和您在已安装的应用程序中添加的新创建的应用程序模型生成SQL命令,而migration会在数据库文件中执行这些SQL命令。
分别运行下面两条命令
python manage.py makemigrations
python manage.py migrate
默认开启的某些应用需要至少一个数据表,所以在使用他们之前需要在数据库中创建一些表
创建数据库和表的命令
python manage.py migrate
这个 migrate 命令检查 INSTALLED_APPS 设置,为其中的每个应用创建需要的数据表
改变模型需要这三步:
编辑 models.py 文件,改变模型。
运行 python manage.py makemigrations 为模型的改变生成迁移文件。
运行 python manage.py migrate 来应用数据库迁移,在数据库里创建新定义的模型的数据表。
sqlmigrate 命令接收一个迁移的名称,然后返回对应的 SQL
python manage.py sqlmigrate blog 0001
sqlmigrate 命令并没有真正在你的数据库中的执行迁移 - 它只是把命令输出到屏幕上
创建一个管理员账号(需要先迁移数据库)
python manage.py createsuperuser
python manage.py runserver
管理员登录界面
http://127.0.0.1:8000/admin/
向管理页面中加入博客应用并管理帖子Post对象
fields
决定Model的form中包括哪些字段,不能指定不可编辑的字段
exclude
决定Model的form中排除哪些字段
list_display
在管理员的更改列表页面上显示字段。不支持ManyToManyField字段
如果未设置list_display,管理站点将显示一列,显示__str__()每个对象的表示形式。
如果字段是ForeignKey,Django将显示 __str__()相关对象。
如果字段是BooleanField,Django将显示一个漂亮的“开”或“关”图标而不是True或False。
list_display_links
默认情况下,更改列表页面会将第一列(指定的第一个字段)链接到每个项目的更改页面。
将其设置None为根本没有链接
必须在list_display
list_editable
字段在列表页面上显示为表单小部件,允许用户一次编辑和保存多个行
list_filter
为激活管理员更改列表页面右侧边栏中的过滤器
ordering
为指定如何在Django管理视图中排序对象列表。这应该是与模型ordering参数格式相同的列表或元组。
['升序'] 、['-降序']、['?随机'] 、['-降序', '升序']
search_fields
在管理员更改列表页面上启用搜索框
actions_on_top = True
actions_on_bottom = False
控制操作栏显示在页面上的位置
list_per_page
为控制每个分页管理员更改列表页面上显示的项目数。默认情况下,此设置为100。
list_max_show_all
控制“显示全部”管理员更改列表页面上可显示的项目数。仅当总结果计数小于或等于此设置时,管理员才会在更改列表中显示“全部显示”链接。默认情况下,此设置为200。
打开 trydjango/blog/admin.py 文件
from django.contrib import admin
from blog.models import Post, Category, Tag
class CategoryAdmin(admin.ModelAdmin):
list_display = ('id', 'cname')
ordering = ['id']
class TagAdmin(admin.ModelAdmin):
list_display = ('id', 'tname')
class PostAdmin(admin.ModelAdmin):
fields = (('title', 'category'), 'content', 'created_time', 'tags', 'is_published')
exclude = ('modified_time',)
list_display = ('title', 'category', 'created_time', 'modified_time', 'is_published')
list_display_links = ('title',)
list_editable = ('created_time',)
list_filter = ('created_time', 'modified_time')
ordering = ['-modified_time']
search_fields = ['title']
actions_on_top = False
actions_on_bottom = True
actions_selection_counter = True
list_per_page = 6
list_max_show_all = 200
# Register your models here.
admin.site.register(Category, CategoryAdmin)
admin.site.register(Tag, TagAdmin)
admin.site.register(Post, PostAdmin)
TIME_ZONE = 'Asia/Shanghai'
INSTALLED_APPS = (
'django.contrib.admin', 管理员站点
'django.contrib.auth', 认证授权系统
'django.contrib.contenttypes', 内容类型框架
'django.contrib.sessions', 会话框架
'django.contrib.messages', 消息框架
'django.contrib.staticfiles', 管理静态文件的框架
'blog.apps.BlogConfig', 添加此项,取自trydjango/blog/apps.py
)
trydjango/blog/apps.py文件内容如下:
from django.apps import AppConfig
class BlogConfig(AppConfig):
name = 'blog'
verbose_name = '博客' 别名,可用于汉化
编辑 trydjango/blog/models.py 文件
创建三个模型:类别Category、标签Tag和帖子Post
Django 要求模型必须继承 models.Model 类。
通过一个内嵌类“class Meta”给你的model定义元数据
模型的元数据,指的是“除了字段外的所有内容”,例如排序方式、数据库表名、人类可读的单数或者复数名等等
Meta类用来汉化,verbose_name(详细名称),plural(复数,带s时候会用到)
class Meta:
verbose_name = '别名'
verbose_name_plural = verbose_name
类中的__str__方法是在打印类的实例对象object()时,调用该方法,返回自定义字符串
def __str__(self):
return self.name
类别Category
Category 只需要一个简单的类别名 cname 就可以了。
CharField 指定了分类名 cname 的数据类型,CharField 是字符型,
CharField 必须加的 max_length 参数指定其最大长度,超过这个长度的分类名就不能被存入数据库。
标签Tag
只需要一个简单的标签名 tname
帖子Post
title 标题
content 正文使用了TextField来存储大段文本,存储比较短的字符串可以使用 CharField
created_time 创建时间,存储时间的字段用 DateTimeField 类型。
modified_time 最后一次修改时间,存储时间的字段用 DateTimeField 类型。
在这里把Post对应的数据库表和Category、Tag对应的数据库表关联了起来,但是关联形式稍微有点不同。
category 对于类别来说,一篇文章通常只能对应一个类别,但是一个类别下可以有多篇文章,
所以我们使用的是 ForeignKey,即一对多的关联关系。on_delete=models.CASCADE
ForeignKey 在后台中以选择框 <select> 的形式展示
tags 对于标签来说,一篇文章可以有多个标签,同一个标签下也可能有多篇文章,
所以我们使用 ManyToManyField,表明这是多对多的关联关系。
同时我们规定文章可以没有标签,因此为标签 tags 指定了 blank=True。
则trydjango/blog/models.py文件中包含以下代码
from django.db import models
from django.utils import timezone
# Create your models here.
class Category(models.Model):
cname = models.CharField(verbose_name='类别', max_length=20)
class Meta:
verbose_name = '类别'
verbose_name_plural = verbose_name
def __str__(self):
return self.cname
class Tag(models.Model):
tname = models.CharField(verbose_name='标签', max_length=20)
class Meta:
verbose_name = '标签'
verbose_name_plural = verbose_name
def __str__(self):
return self.tname
class Post(models.Model):
title = models.CharField(verbose_name='标题', max_length=100)
content = models.TextField(verbose_name='正文', default='')
created_time = models.DateTimeField(verbose_name='创建时间', default=timezone.now)
modified_time = models.DateTimeField(verbose_name='修改时间', auto_now=True)
is_published = models.BooleanField(verbose_name='是否发布', default=True)
category = models.ForeignKey(Category, verbose_name='类别', on_delete=models.CASCADE)
tags = models.ManyToManyField(Tag, verbose_name='标签', blank=True)
class Meta:
ordering = ['created_time']
verbose_name = '帖子'
verbose_name_plural = verbose_name
def __str__(self):
return self.title
迁移数据库
每当我们创建模型,删除模型或更新我们项目的任何models.py中的任何内容时。我们需要运行两个命令makemigrations和migrate。makemigrations基本上会为预安装的应用程序(可以在settings.py中的已安装应用程序中查看)和您在已安装的应用程序中添加的新创建的应用程序模型生成SQL命令,而migration会在数据库文件中执行这些SQL命令。
分别运行下面两条命令
python manage.py makemigrations
python manage.py migrate
默认开启的某些应用需要至少一个数据表,所以在使用他们之前需要在数据库中创建一些表
创建数据库和表的命令
python manage.py migrate
这个 migrate 命令检查 INSTALLED_APPS 设置,为其中的每个应用创建需要的数据表
改变模型需要这三步:
编辑 models.py 文件,改变模型。
运行 python manage.py makemigrations 为模型的改变生成迁移文件。
运行 python manage.py migrate 来应用数据库迁移,在数据库里创建新定义的模型的数据表。
sqlmigrate 命令接收一个迁移的名称,然后返回对应的 SQL
python manage.py sqlmigrate blog 0001
sqlmigrate 命令并没有真正在你的数据库中的执行迁移 - 它只是把命令输出到屏幕上
创建一个管理员账号(需要先迁移数据库)
python manage.py createsuperuser
python manage.py runserver
管理员登录界面
http://127.0.0.1:8000/admin/
向管理页面中加入博客应用并管理帖子Post对象
fields
决定Model的form中包括哪些字段,不能指定不可编辑的字段
exclude
决定Model的form中排除哪些字段
list_display
在管理员的更改列表页面上显示字段。不支持ManyToManyField字段
如果未设置list_display,管理站点将显示一列,显示__str__()每个对象的表示形式。
如果字段是ForeignKey,Django将显示 __str__()相关对象。
如果字段是BooleanField,Django将显示一个漂亮的“开”或“关”图标而不是True或False。
list_display_links
默认情况下,更改列表页面会将第一列(指定的第一个字段)链接到每个项目的更改页面。
将其设置None为根本没有链接
必须在list_display
list_editable
字段在列表页面上显示为表单小部件,允许用户一次编辑和保存多个行
list_filter
为激活管理员更改列表页面右侧边栏中的过滤器
ordering
为指定如何在Django管理视图中排序对象列表。这应该是与模型ordering参数格式相同的列表或元组。
['升序'] 、['-降序']、['?随机'] 、['-降序', '升序']
search_fields
在管理员更改列表页面上启用搜索框
actions_on_top = True
actions_on_bottom = False
控制操作栏显示在页面上的位置
list_per_page
为控制每个分页管理员更改列表页面上显示的项目数。默认情况下,此设置为100。
list_max_show_all
控制“显示全部”管理员更改列表页面上可显示的项目数。仅当总结果计数小于或等于此设置时,管理员才会在更改列表中显示“全部显示”链接。默认情况下,此设置为200。
from django.contrib import admin
from blog.models import Post, Category, Tag
# Register your models here.
list_display = ('id', 'cname')
ordering = ['id']
class TagAdmin(admin.ModelAdmin):
list_display = ('id', 'tname')
class PostAdmin(admin.ModelAdmin):
fields = (('title', 'category'), 'content', 'created_time', 'tags', 'is_published')
exclude = ('modified_time',)
list_display = ('title', 'category', 'created_time', 'modified_time', 'is_published')
list_display_links = ('title',)
list_editable = ('created_time',)
list_filter = ('created_time', 'modified_time')
ordering = ['-modified_time']
search_fields = ['title']
actions_on_top = False
actions_on_bottom = True
actions_selection_counter = True
list_per_page = 6
list_max_show_all = 200
# Register your models here.
admin.site.register(Category, CategoryAdmin)
admin.site.register(Tag, TagAdmin)
admin.site.register(Post, PostAdmin)
#取消注册 admin.site.unregister()
#添加标题 admin.site.site_header = "hello"
评论
发表评论