初学Django
搭建环境
- 跟着视频在cmd中操作了半天,最终还是采用了pycharm自动生成的虚拟环境,但是此处保留两个疑问,自动创建的django的版本是多少呢?怎样就可以自己决定版本号呢?
- 因为学习只停留在自我学习中,不会出现不兼容的问题,如果出现再寻找答案(后续出现问题时补充)
创建app
- 在cmd中找到当前项目的文件夹 使用python manage.py startapp [名称]来快速的创建一个app模板
debug模式
- settings有debug模式,在开发时可以使用用来了解程序的错误,但是在投入线上的时候切记不可将该模式打开.
url
1)url映射:
- 为什么在urls.py文件中寻找映射?
因为在‘settings.py文件中配置 了‘ROOT_URLCONF’为‘urls.py’`
ROOT_URLCONF = 'Django_let04.urls'`
url传递参数:
- a.在url中使用变量的方式传递参数使用<参数name>且可以传递多个参数
def book_detail(request,book_id,category_id):
# 可以从数据库中根据book_id提取这个图书的信息
text = "你获取的图书id是:%s,图书分类是:%s" % (book_id,category_id)
return HttpResponse(text)
path('book/detail/<book_id>/<category_id>/', views.book_detail),
表现形式如下:
- b.在url中使用查询字符串的形式,不需要传递参数只需要在视图函数中使用request.GET.get( 名称)即可,且因为使用的是GET请求是一个类似字典的类型
def author_detail(request):
author_id = request.GET.get('id')
text = "作者的id是:%s" % author_id
return HttpResponse(text)
path('book/author/',views.author_detail),
表现形式如下:
django会内置url转换器
- 在 ‘converters.py’ 下django内置了四种url转换器
DEFAULT_CONVERTERS = {
'int': IntConverter(),# 一个或多个数字
'path': PathConverter(),# 所有的字符全部满足包括/
'slug': SlugConverter(),# 英文中横杠,英文字符数字和下划才满足
'str': StringConverter(),# 除了斜杠所有的字符
'uuid': UUIDConverter(),# 只有满足uuid.uuid4()的返回字符
}
- 且在没有写任何转换器情况下默认为的str
path('book/detail/<:book_id>/<str:category_id>/', views.book_detail),
使用include将app模块化:
- 主urls文件会自动拼接urls.py文件的不要多加‘/’
# 注意include内的book.urls在当前项目的路径下
from django.urls import path,include
urlpatterns = [
path('admin/', admin.site.urls),
path('book/',include('book.urls')),
]
url命名,反转
- 在path函数中传递name参数即可指定名字,这时只需要更改urls文件中path中的url即可完成统一的更改
path('signin/',views.login,name='login'),
,并且要在views文件中完成url的反转
return redirect(reverse('login'))
reverse中可以传递kwargs的参数
return redirect(reverse('cms1:login',kwargs={"book_id":1,"category_id":2}))
- 在多个app中间可能会出现重复的现象这时应该采用应用命名空间用来区分,命名规则:在app的urls.py中命名app_name的变量
app_name = 'front'
- redirect为跳转,revers为反转均在django.shortcuts中
return redirect(reverse('front:login'))
应用命名空间和实例命名空间的区别
应用命名空间也叫app命名空间
一个app可以由多个url进行映射,为了避免发生混淆的问题要在inclued中传递namepace参数
urlpatterns = [
path('',include('front.urls')),
path('cms1/',include('cms.urls',namespace='cms1')),
path('cms2/',include('cms.urls',namespace='cms2')),
]
以后在做反转的时候要根据实例命名空间来指定具体的url
current_namespace = request.resolver_match.namespace
return redirect('%s:login' % current_namespace)
include 函数
1.include(module,namespace=None):
**module为url字符串
*namespace 为实例命名空间,使用时需要在子url中写变量app_name
path('cms2/',include('cms.urls',namespace='cms2')),
2.也可向include中传递元组这样即不需要写实例命名空间
path('cms/',include(('cms.urls','cms'))),
re_path函数
re_path和path使用规则相同但是re_path可以使用正则表达式来写功能更加强大,并且在正则表达式中定义变量需要用?P<参数名字>并在后面添加正则表达式的规则
!!!!如果不是特别要求尽量用path
re_path(r"^list/(?P<year>\d{4})/$",views.article_list),