文章目录
访问权限
ALLOWED_HOSTS = ['*']
数据库设置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'blog',
'USER':'root',
'PASSWORD':'1234',
'HOST':'127.0.0.1',
'POST':'3306',
}
}
地区时间
LANGUAGE_CODE = 'zh-hans' #语言修改为中文
TIME_ZONE = 'Asia/Shanghai'
数据库迁移
python manage.py makemigrations
python manage.py migrate
创建管理帐号和密码
python manage.py createsuperuser
启动Django项目
python manage.py runserver
静态文件查找
STATICFILES_DIRS = ( #`DTL`会在这个列表的路径中查找静态文件
os.path.join(BASE_DIR, 'static'),
)
配置全局后,在页面中不需要使用 {% load static %} 进行导入了 TEMPLATES/OPTIONS
{% load static %} #表明该模板下的这一块内容将有可能被子模板覆盖。
'builtins': ['django.templatetags.static'] ,
前端
{% include 'head.html' %}
<div>中部</div>
{% include 'footer.html' %}
相同的代码单独提取出来放在 base.html页面里,然后在代码不同的位置,也就是主体那里用模板标签{% block content %} {% endblock %}替换。
templates/base.html
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>MyBlog</title>
</head>
<body>
<div>头部</div>
{% block content %} #content可以自由命名
{% endblock %}
<div>尾部</div>
</div>
</body>
</html>
组合成一个完整的首页
templates/index.html
{% extends "base.html" %} #继承 base.html页面的代,使用继承方法的话,这个代码一定要放页面的第一行。
{% include 'head.html' %}
{% block content %}
<div>中部</div>
{% endblock %}
{% include 'footer.html' %}
调用url
{% url 'xxx' %} #xxx为别名 网站首页就是{% url 'index' %}
自动找到模板
'DIRS': [os.path.join(BASE_DIR, 'templates')] #TEMPLATES中
导出数据
python manage.py dumpdata > data.json
导入数据
python manage.py loaddata data.json
自己做欢迎页面
myblog/blog/views.py
from django.http import HttpResponse
def hello(request):
return HttpResponse('欢迎使用Django!')
myblog/myblog/urls.py
from django.contrib import admin
from django.urls import path
from blog import views #+
urlpatterns = [
path('admin/', admin.site.urls),
path('', views.hello), #+
]
ORM
Here, each model is represented by a class that subclasses django.db.models.Model.
在这里,每个模型都由一个类表示,该类是django.db.models.model的子类。
CharField:字符串类型,映射到数据库中会转换成varchar类型,使用时必须传入max_length属性以定义该字符串的最大长度,如果超过254个字符,就不建议使用CharField了,此时建议使用TextField。
ManyToManyField(多对多)
class Meta:
verbose_name = '少的是内部'
verbose_name_plural = '多的是外部'
null 数据库中字段是否可以为空(null=True)
default 数据库中字段的默认值
null与blank的对比
- null 是针对数据库而言,如果 null=True, 表示数据库的该字段可以为空。
- blank 是针对表单的,如果 blank=True,表示你的表单填写该字段的时候可以不填 默认False
后台
修改后台管理页面头部显示内容和页面标题
admin.site.site_header = '头部显示内容'
admin.site.site_title = '页面标题'
@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin): 内部
文章列表里显示想要显示的字段
list_display = ('id', 'category','title', 'tui', 'user','views','created_time')
设置哪些字段可以点击进入编辑界面
list_display_links = ('title','views','created_time')# 设置哪些字段可以点击进入编辑界面 默认id
ist_display_links = ('name',) #格式必须是list, a tuple, or None
list_display_links = ('name') #不加, 报错
显示每个页面的记录条数
list_per_page = 50 # 满50条数据就自动分页 默认100
排序方式
ordering = ('-id',) #后台数据列表排序方式
The value of 'ordering' must be a list or tuple -号表示降序
在列表里就可编辑字段
#list_editable 设置默认可编辑字段,在列表里就可以编辑
list_editable = ['title', 'user']
"操作选项"的设置
actions_on_top=True #列表顶部,设置为False不在顶部显示,默认为True。
actions_on_bottom=False #列表底部,设置为False不在底部显示,默认为False。
定制Action行为具体方法
def func(self, request, queryset):
queryset.update(created_time='2020-01-01')#将created_time字段的值设置为2020-01-01
func.short_description = "将发布时间设置为2020-01-01"
actions = [func, ]
自定义列
在Model中定义一个方法
def riqi(self):
return self.created_time.strftime("%b %d %Y %H:%M:%S")
riqi.short_description = '发布日期' # 设置方法字段在admin中显示的标题
riqi.admin_order_field='created_time' #指定排序依据
在admin.py里把我们定义的方法加在list_display里
list_display = ('riqi',)
搜索框
search_fields=['title'] #指定标题title做为搜索字段
分层筛选
date_hierarchy = 'created_time' # 详细时间分层筛选
str
url
添加DjangoUeditor的URL
path('ueditor/', include('DjangoUeditor.urls')), #没有改行代码编辑器里就上传不了图片
编辑器内容里可以显示上传的图片
re_path('^media/(?P<path>.*)$', serve, {'document_root': settings.MEDIA_ROOT}),#增加此行
模板
urls.py
path('', views.index, name='index'),
views.py
def index(request):
sitename = 'Django中文网' #添加两个变量,并给它们赋值
url = 'www.django.cn'
context = { #把两个变量封装到上下文里
'sitename': sitename,
'url':url,
}
return render(request,'index.html',context) #把上下文传递到模板里
index.html
<h3>网站名:{{ sitename }}</h3> {{变量名}}模板变量
<h3>域名:{{ url }}</h3>
例二
blog/views.py
def index(request):
sitename = 'Django中文网'
url = 'www.django.cn'
#新加一个列表
list=[
'开发前的准备',
'项目需求分析',
'数据库设计分析',
'创建项目',
'基础配置',
'欢迎页面',
'创建数据库模型',
]
context = {
'sitename': sitename,
'url':url,
'list':list, #把list封装到context
}
return render(request,'index.html',context)
<div>
<ul>
<h4>Blog教程目录:</h4>
{% for list in list %}
<li>{{ list }}</li>k
{% endfor %}
</ul>
</div>
遍历输出变量
{{% for foo in list %}
{% endfor %}
字典
mydict={
'name': '吴秀峰',
'qq': '445813',
'wx': 'vipdjango',
'email': '445813@qq.com',
'Q群': '10218442',
}
context = {
...
#把mydict封装到上下文
'mydict':mydict,
}
{% for key,values in mydict.items %}
<li>{{ key }}:{{ values }}</li>
{% endfor %}
数据查询
def index(request):
#对Article进行声明并实例化,然后生成对象allarticle
allarticle = Article.objects.all()
#把查询到的对象,封装到上下文
context = {
'allarticle': allarticle,
}
#把上传文传到模板页面index.html里
return render(request,'index.html',context)
<div>
<ul>
<h4>所有文章:</h4>
{% for article in allarticle %}
<li>{{ article.title }}</li>
{% endfor %}
</ul>
</div>
locals()
locals()的作用是返回一个包含当前作用域里面的所有变量和它们的值的字典
url分层模块化
book app下 urls 方便管理urls地址
反转
reverse 反转 从url中的name找到路径 避免跳转页面写死
之前urls中定义的name
应用命名空间
应用命名空间:多个app中可能有相同的name 反转的时候可能不知道哪一个
一个app下的urls中
或者在url下的urlpattern下指定
)
views下
实例命名空间用法
若一个app有2个实例,你输入1个实例的地址,可能是跳转到另一个实例的地址
前提:要有应用命名空间
当前登录页面
re_path
re中定义一个参数或变量,要使用()进行包裹
给参数取名之?P<name>