文件名 | 描述 |
---|---|
init.py | 告诉Python这是一个什么软件包 |
urls.py | 全局URL配置 ,负责把URL模式映射到应用程序 |
settings.py | 项目相关的配置 ,包括数据库信息,调试标志以及其他一些工作的变量。 |
manage.py | 应用的命令行接口,通过它可以调用django shell和数据库等。 |
templates文件夹 | |
文件名 | 描述 |
---|---|
init.py | 告诉Python这是一个包 |
urls.py | 应用的urls配置文件,这个文件不会像项目的URL.conf那样自动创建 |
models.py | 数据模型 |
views.py | 视图函数(即MVC中的控制器), |
tests.py | 单元测试 |
命令行 | 描述 |
---|---|
django-admin.py startproject mysite | 创建一个Django工程项目名为 mysite |
python manage.py startapp blog | 在mysite目录下创建blog应用 |
python manage.py runserver 8080 | 在本机8080端口启动Django程序 |
python manage.py makemigrations | 生成同步数据库的脚本 |
python manage.py migrate | 同步数据库 |
python manage.py createsuperuser | 为进入这个项目的后台创建超级管理员,并设置用户名和密码 |
python manage.py flush | 清空数据库 |
django-admin.py help startapp | 查询某个命令的详细信息 |
python manage.py shell | 启动交互界面 |
注意:在开发过程中,数据库同步误操作之后,难免会遇到后面不能同步成功的情况,解决这个问题的一个简单粗暴方法是把migrations目录下的脚本(除__init__.py之外)全部删掉,再把数据库删掉之后创建一个新的数据库,数据库同步操作再重新做一遍。
Django内置的Web服务器,该服务器运行在本地,专门用于开发阶段。
为什么会存在这个开发服务器?主要有以下几点原因。
#template文件夹下的times.html文档
Title
hello index1
hi {{ time }}
---------------------------------------urls.py------------------------------------------------
from blog import views
path('show_time/', views.show_time),
------------------------------------blog下的views.py文件------------------------------
import time
def show_time(request):
t= time.ctime()
return render(request,"times.html",{"time":t})
按照我们之前些HTML文档进行渲染时,我们会在HTML文档中引入JQuery文件。
------------------template文件夹下的times的HTML文档
Title
hello index1
{#hello {{ t }}
#}
hi {{ time }}
通过改方法,我们不难发现,这样并不能将字体颜色调成红色,原因是Django程序无法找到JQuery文件,导致错误。
JS代码是浏览器进行调用的, 当Django程序执行到了return render(request,“times.html”,{“time”:t})方法时,会将t的值赋值给HTML文档的{{time}},然后再将整个HTML文档发给浏览器。
面对该问题,我们之后都会将JS文件和的JQuery文件和图片等等放在一个static文件夹(如果不存在该文件夹,可以自行创建)。该文件夹与应用blog并列,如果我们的项目比较大时,我们可以将static文件夹放在应用blog文件夹下。
为了Django文件能够找到static下的文件,我们还需对其进行配置
STATICFILES_DIRS=(
os.path.join(BASE_DIR,"static"),
)
注意点:STATICFILES_DIRS是一个元组,每一个元素后面需要加一个逗号。
STATIC_URL = ‘/static/’ 这是一个别名,之后的查找都需要通过别名来查找。
引入Jquery文件还有一个方式,并且推荐使用改方式
{% load staticfiles %}
Title
当用户从Django支持的站点请求页面时,这是系统遵循的算法,以确定要执行的Python代码:
Django确定要使用的根URLconf模块。通常,这是ROOT_URLCONF设置的值,但如果传入 HttpRequest对象具有urlconf 属性(由中间件设置),则将使用其值代替 ROOT_URLCONF设置。
Django加载Python模块并查找变量 urlpatterns。这应该是一个序列的 django.urls.path()和/或django.urls.re_path()实例。
Django按顺序遍历每个URL模式,并在匹配请求的URL的第一个模式停止。
一旦其中一个URL模式匹配,Django就会导入并调用给定的视图,这是一个简单的Python函数(或基于类的视图)。视图传递以下参数:
URL配置(URLconf)就像Django 所支撑网站的目录。它的本质是URL模式以及要为该URL模式调用的视图函数之间的映射表;你就是以这种方式告诉Django,对于这个URL调用这段代码,对于那个URL调用那段代码。
from django.conf.urls import url
urlpatterns = [
url(正则表达式, views视图函数,参数,别名),
]
参数说明:
一个正则表达式字符串
一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串
可选的要传递给视图函数的默认参数(字典形式)
一个可选的name参数
例子:
urlpatterns = [
url(r'^articles/2019/$', views.special_case_2019),
#http://127.0.0.1:8080/article/2019/
url(r'^articles/[0-9]{4}/$', views.year_archive),
#http://127.0.0.1:8080/article/2019/
url(r'^articles/([0-9]{4})/$', views.year_archive), #no_named group
#http://127.0.0.1:8080/article/2019/
url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),
#http://127.0.0.1:8080/article/2019/08/
url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail),
#http://127.0.0.1:8080/article/2019/08/02
]
上面的示例使用简单的、未命名的正则表达式组(通过括号)捕获URL的位,并将它们作为位置参数传递给视图。这带来的问题是,在编程时,我们需要确定正则表达式分组元素的位置,否则我们会乱套变量的值。在更高级的使用中,可以使用命名正则表达式组捕获URL位并将它们作为关键字参数传递给视图。
在Python正则表达式中,命名正则表达式组的语法是(?Ppattern),其中name是组的名称,pattern是要匹配的模式。
urlpatterns = [
url(r'^articles/2019/$', views.special_case_2019),
#http://127.0.0.1:8080/article/2019/
url(r'^articles/(?P[0-9]{4})/$', views.year_archive),
#http://127.0.0.1:8080/article/2019/
url(r'^articles/(?P[0-9]{4})/(?P[0-9]{2})/$', views.month_archive),
#http://127.0.0.1:8080/article/2019/08/
url(r'^articles/(?P[0-9]{4})/(?P[0-9]{2})/(?P[0-9]{2})/$', views.article_detail),
#http://127.0.0.1:8080/article/2019/08/22/
]
from django.urls import path
urlpatterns = [
path(route, view, kwargs=None, name=None)
]
参数说明:
该route参数应该是一个字符串或 gettext_lazy(),其中包含一个URL模式。该字符串可能包含尖括号(如上所示)以捕获URL的一部分并将其作为关键字参数发送到视图。尖括号可以包括转换器规范(如int部分),其限制匹配的字符并且还可以改变传递给视图的变量的类型。例如,匹配一串十进制数字并将值转换为a int。
所述view参数是一个视图函数或的结果 as_view()为基于类的视图。它也可以是一个django.urls.include()。
该kwargs参数允许您将其他参数传递给视图函数或方法。
笔记:
要从URL捕获值,请使用尖括号。
捕获的值可以选择包括转换器类型。例如,用于 捕获整数参数。如果未包含转换器/,则匹配除字符之外的任何字符串。
没有必要添加前导斜杠,因为每个URL都有。例如,它articles不是/articles。
----------------------------------------------------------------------------------------------
from django.urls import path
urlpatterns = [
re_path(route, view, kwargs=None, name=None)
]
参数说明:
该route参数应该是一个字符串或 gettext_lazy(),其中包含与Python的兼容的正则表达式re模块。字符串通常使用原始字符串语法(r''),以便它们可以包含序列,\d而无需使用另一个反斜杠转义反斜杠。进行匹配时,将正则表达式中捕获的组传递给视图 - 如果组已命名,则作为命名参数,否则作为位置参数。值以字符串形式传递,不进行任何类型转换。
view,kwargs和name参数与 path()是一样的。
这是一个示例URLconf:
from django.urls import path
from . import views
urlpatterns = [
path('articles/2019/', views.special_case_2019),
path('articles//', views.year_archive),
path('articles///', views.month_archive),
path('articles////', views.article_detail),
]
示例请求:
127.0.0.1:8080/articles/2005/03/与列表中的第三个条目匹配。Django会调用该函数。views.month_archive(request, year=2005, month=3)
127.0.0.1:8080/articles/2003/将匹配列表中的第一个模式,而不是第二个模式,因为模式是按顺序测试的,第一个是第一个要通过的测试。随意利用订单插入这样的特殊情况。在这里,Django会调用该函数。views.special_case_2003(request)
127.0.0.1:8080/articles/2003 不匹配任何这些模式,因为每个模式都要求URL以斜杠结尾。
127.0.0.1:8080/articles/2003/03/building-a-django-site/将匹配最终模式。Django会调用该函数 。views.article_detail(request, year=2003, month=3, slug=“building-a-django-site”)
默认情况下,以下路径转换器可用:
------------------------------------register.html文件-------------------------------------------------
Title
-------------------------------------views.py-----------------------------------------------
def register(request):
if request.method=="POST":
print(request.POST)
print(request.POST.get("name"))
return HttpResponse("OK")
return render(request, "register.html")
---------------------------------------urls.py----------------------------------------------
path('register/', views.register)
在views.py上的设计,能够实现一种视图提供两个方法(POST、GET)。
不知道是否还记得urls.path中还有一个参数为name,这个别名参数的应用是很大的。在之后写项目维护的过程中,我们难免会对以创建的视图进行更名操作,但我们不可能总回到所有的文件中修改,这时候就用到了参数name了。
name的作用:
在url的路由配置中加上一个name的设置的话,在使用到url的路径时,都可以用name的别名代替,减少路由修改和维修的代价
主要应用在页面重定向
模板页面的href跳转({% url ‘url_name’ %})
----------------------------------register.html---------------------
{% load staticfiles %}
Title
这样在访问老的页面时,就会自动跳转到新的页面,不再写入url的路径
name的作用:
name参数可以给这个url取一个合适的名字。通过给url取名字,以后在view或者模板中使用这个URL,就只需要通过这个名字就可以了。
这样做的原因是防止url的规则更改,会导致其他地方用了这个url的地方都需要更改,但是如果取名字了,就不要做任何改动了。
在任何时候,您的urlpatterns都可以“包含”其他URLconf模块。这本质上,“根”是一组位于其他url之下的url。
例如,下面是Django网站本身的URLconf的摘录。
它还包括其他一些urlconf:
from django.conf.urls import include, url
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^blog/', include('blog.urls')),
]
该意义大概可以理解成,凡是以blog开头的路径,都在blog应用文件夹下的urls进行查找。