Django学习总结(七)
PyxYuYu opened this issue · 0 comments
PyxYuYu commented
Life is a sail trip full of chances and challenges.
0x01 Django
Django Blog
学习总结Django Tips
URLconf urls.py
URLconf
解释器有关正则表达式中命名组和非命名组遵循的规则- 如有有任何命名的组,
Django
会忽略非命名组而直接使用命名组 - 只有非命名组,
Django
会将所有非命名组以位置参数的形式传递
- 如有有任何命名的组,
- 给
views.py
中视图函数传递参数的方法- 方法一:利用命名组或非命名组,
Django
自动从URL
中捕获所需变量对视图函数参数进行传递 - 方法二:视图函数中的参数也可以用
urlpattrens
中字典变量来进行赋值
from django.contrib.sitemaps.views import sitemap form blog.sitemaps import PostSitemap sitemaps = { 'posts': PostSitemap } urlpatterns = [ url(r'sitemap\.xml$', sitemap, {'sitemaps': sitemaps}), ]
- 方法一:利用命名组或非命名组,
URLconf
是从上向下的解析顺序,所以可以在最上面匹配特定的视图(某个特定的URL
)
urlpatterns = [ url(r'^auth/user/add/$', views.user_add_stage), url(r'^([^/])/([^/])/add/$', views.add_stage), ]
- 在解析
URLconf
时,请求方法(例如GET
POST
HEAD
)不会被考虑,对于相同的URL
所有请求方法都会被导向到相同的视图函数中,请求方法的处理就是在视图函数中完成- 例如:
/post/?page=1
对应的是匹配post/
- 例如:
- 在任何时候,只要根目录是一致的情况,
URLconf
都可以包含其他的URLconf
模块,指向include()
的正则表达式不包含$
,只包含一个斜杠,它将截断匹配的URL
,将剩余的字符串发送给包含中的URLconf
进一步匹配处理
url(r'^blog/', include('blog.urls', name='blog', app_name='blog')),
views.py
URLconf
捕捉到的变量传递给视图函数的参数是字符串,而不是其他类型,有些时候需要转换类型使用,比如datetime.date(int(year), int(month), int(day))
- 使用默认视图参数
- 视图函数中定义的默认参数是字符串,而不是整数,因为
URL
捕捉到的是字符串
# views.py def page(request, num='1') #...
- 一般应用于多个
URL
表达式指向同一视图函数,其中一个表达式没有任何传递参数,这个时候就会利用到定义的默认参数
- 视图函数中定义的默认参数是字符串,而不是整数,因为
- 视图函数可以用
Python
中一个优雅的特性:带星号的可变参数*args **kwargs
- 这样就允许函数接受动态的、可变数量的、参数名只在运行时可知的参数
*args
: 传递给函数的参数会保存为一个元组**kwargs
: 传递给函数的参数会保存为一个字典
- 模板
- 自动转义
escape
- 在模板生成
HTML
时,会存在一定的风险,导致XSS
漏洞的产生,所以Django
默认会对模板中每个变量标签的输出进行转义,尤其是\ > ' " &
这五个字符的转义 - 如果需要关闭转义的话,有以下方法:
- 单独变量,利用
safe
过滤器为单独变量关闭自动转义
{{ data|safe }}
- 模板块,利用
autoescape
来包含这个模板(或模板中常用的一部分),如果写在base.html
中,被其他模板继承的话,也是继续有效果的
{% autoescape off %} {{ data }} {% block content %} {% endblock %} {% autoescape on %} {{ data }} {% endautoescape %} {% endautoescape %}
- 单独变量,利用
- 过滤器参数中的字符串常量是不会被自动转义的,如果关闭了自动转义
{{ data|default:"xxxxx" }}
- 上面过滤器表示,如果
data
空,那么输出默认的xxxxx
- 所以默认的
xxxxx
中最好不要带\ > ' " &
,要带的话,也应该先讲他们转义,再进行输入
- 在模板生成
- 自动转义
- 外键 和 多对多值
- 通过
属性名(小写) + _set
可以反向获取其内容 属性名_set
是一个QuerySet
查询集
class Author(models.Model): name = models.CharField(max_length=25) age = models.IntegerField() # 一本书一个作者 class Book(models.Model): author = models.ForeignKey(Author) title = models.CharField()
- 从作者获取书籍
a = Author.objects.get(name='xxx') books = a.book_set.all()
- 通过