django-admin startproject users # 在当前目录下创建一个Django程序
python manage.py runserver ip:port 或 shift+F10 # 启动服务器,默认ip和端口为http://127.0.0.1:8000/
python manage.py startapp appname # 新建 app
python manage.py makemigrations # 显示并记录所有数据的改动
python manage.py migrate # 将改动更新到数据库
python manage.py createsuperuser # 创建超级管理员
python manage.py dbshell # 数据库命令行,不用另外打开终端,可以在PyCharm中操作数据库
python manage.py # 查看命令列表
# 默认是SQLit 3 的配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
# MySQL的配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME':'books', # 注意这里的数据库应该以utf-8编码,在创建数据库的时候需要指定编码
'USER': 'root', # 数据库的用户名
'PASSWORD': '123456', # 数据库的密码
'HOST': '127.0.0.1', # 指定ip
'PORT': '3306', # 指定端口
}
}
# 对于python3的使用者们还需要再加一步操作
# 由于Django内部连接MySQL时使用的是MySQLdb模块,而python3中还无此模块,所以需要使用pymysql来代替
# 如下设置放置的与project同名的配置的 __init__.py文件中
# 作用是让Django的ORM能以mysqldb的方式来调用PyMySQL
import pymysql 或 from pymysql import install_as_MySQLdb
pymysql.install_as_MySQLdb()
# PostgreSQL配置
DATABASES = {
'default': {
'NAME': 'books',
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'USER': 'root',
'PASSWORD': '123456'
}
# Oracle配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.oracle',
'NAME': 'books',
'USER': 'root',
'PASSWORD': '123456',
'HOST': '127.0.0.1',
'PORT': '1521',
}
}
# 首先在项目根目录下创建static目录
# 接着在settings.py 文件下添加
STATIC_URL = '/static/' # 默认已添加,使用静态文件时的前缀
STATICFILES_DIRS = (
os.path.join(BASE_DIR,'static'), # 由于是元组的格式,行末的逗号不能漏
)
# 这样在template中就可以导入static目录下的静态文件啦
# 在应用urls.py文件中
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^articles/2003/$', views.special_case_2003),
url(r'^articles/([0-9]{4})/$', views.year_archive),
url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),
url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail),
]
/articles/2005/03/
会匹配上面列表中的第三条. Django 会调用函数 views.month_archive(request, '2005', '03')
./articles/2005/3/
不会匹配上面列表中的任何条目, 因为第三条的月份需要二位数字./articles/2003/
会匹配上第一条而不是第二条,因为匹配是按照从上到下顺序而进行的, Django 会调用函数 views.special_case_2003(request)
/articles/2003
不会匹配上面列表中的任何条目, 因为每个URL应该以 / 结尾./articles/2003/03/03/
会匹配上最后一条. Django 会调用函数 views.article_detail(request,
'2003',
'03',
'03')
.在上面的简单例子中,并没有使用正则表达式分组,在更高级的用法中,很有可能使用正则分组来匹配URL并且将分组值通过参数传递给view函数。
在Python的正则表达式中,分组的语法是 (?P
, name表示分组名,pattern表示一些匹配正则.
这里是一个简单的小例子:
# dj_first/urls.py
from django.conf.urls import url, include
from django.contrib import admin
urlpatterns = [
url(r'^admin/', admin.site.urls),
# 添加
url(r"^users/", include('users.urls', namespace='users')),
]
# users/urls.py
from django.conf.urls import url
from . import views
urlpatterns = [
# 添加
url(r"^index/$", views.index, name='index'), # 添加应用的路由
url(r"^books/$", views.show_books, name='books'), # 添加应用的路由
]
# users/views.py
def show_books(request):
# books = BookInfo.objects.all() # 在页面中展示刚才在Models.py中创建的BookInfo 数据
data = {
'city': '北京',
'adict': {
'name': '西游记',
'author': '吴承恩'
},
'alist': [1, 2, 3, 4, 5]
}
return render(request, 'index.html', context=data)
在上面这个例子中,如果请求url为 /users/books/
则会调用函数 show_books()
.
使用二级路由也可以减少代码冗余,使代码更加简洁易懂
在定义路由的时候,可以为路由命名,方便查找特定视图的具体路径信息。
1) 在使用include函数定义路由时,可以使用namespace参数定义路由的命名空间,如
url(r'^users/', include('users.urls', namespace='users')),
命名空间的作用:避免不同应用中的路由使用了相同的名字发生冲突,使用命名空间区别开。
2) 在定义普通路由时,可以使用name参数指明路由的名字,如
urlpatterns = [
# 添加
url(r"^index/$", views.index, name='index'), # 添加应用的路由
url(r"^books/$", views.show_books, name='books'), # 添加应用的路由
]
3) reverse反解析及重定向
def index(request):
"""
index 视图函数名
:param request: 包含了请求信息的请求对象
:return: 响应对象
"""
return HttpResponse('hello world')
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')], # 此处修改
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
# view.py
def index(request):
return render(request, 'index.html', {'title':'welcome'})
# index.html
Title
{{ title }}
模板中也有自己的语言,该语言可以实现数据展示
{% for book in books %}
{{ book }}
{% endfor %}
{{ books }}
{{ city }}
{{ adict }}
{{ adict.name }}
{{ adict.author }}
{{ alist }}
{{ alist.0 }}
小知识点:在模板语言中字典数据类型的取值是通过dict.xxx而不是dict[xxx]
django中内嵌了ORM框架,不需要直接面向数据库编程,而是定义模型类,通过模型类和对象完成数据表的增删改查操作。
# 必须继承models.Model
class BookInfo(models.Model):
"""创建图书模型类"""
# max_length:最大字段的长度,这里必须写
btitle = models.CharField(max_length=20, verbose_name='书名')
bpub_date = models.DateField(verbose_name='发布时间')
bread = models.IntegerField(default=0, verbose_name='阅读量')
bcomment = models.IntegerField(default=0, verbose_name='评论量')
image = models.ImageField(upload_to='img', verbose_name='封面', null=True)
is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')
class Meta:
"""对模型类的设置"""
# db_table:指关联的数据表,并自定义表名,但是需要在迁移前定义,不然无法生效
db_table = 'tb_books'
verbose_name = '图书' # 在admin显示的名称
verbose_name_plural = verbose_name # 显示的复数名称
def __str__(self):
return self.btitle
create table users_bookinfo (
id int unsigned auto_increment primary key not null,
btitle varchar(20) NOT NULL,
......
);
id
,当然,你也可以自己指定主键。SQL
语法。INSTALLED_APPS
处,注册models.py
文件所在的users。看清楚了,是注册app,不是模型,也不是models.py
。
python manage.py migrate
,让操作实际应用到数据库上。这里可以选择在执行migrate之前,先执行python manage.py makemigrations
让修改动作保存到记录文件中。
django amdin是django提供的一个后台管理页面,改管理页面提供完善的html和css,使得你在通过Model创建完数据库表之后,就可以对数据进行增删改查,而使用django admin 则需要以下步骤:
注:不建议新手经常使用admin,会形成依赖,核心的是model模块的操作!
python manage.py createsuperuser
url(r'^admin/', admin.site.urls),
from django.contrib import admin
from users.models import BookInfo, HeroInfo
# Register your models here.
admin.site.register(BookInfo)
创建模型类--->创建数据库--->迁移--->导入数据(若导入数据错误,如果是字段类型写错,改完后要先迁移再重新导入数据)--->admin站点
==主页传送门==