继承模块
class Animal(models.Model): name = models.CharField(max_length=32) class Meta: abstract = True # 设置为抽象模块,即基类模块不会生成 class Cat(Animal): c_color = models.CharField(max_length=32) class Dog(Animal): d_leg = models.IntegerField(default=4)
模型与表的先后顺序
-
db -> models
-
配制好数据库连接信息
-
python manage.py inspectdb > models.py
-
-
models -> db
-
目前使用
环境转移
-
导出所有依赖
-
pip freeze > requirements.txt 把环境导到文档中
-
-
安装所有依赖
-
pip install -r requirements.txt 在新环境中导入
模版语法
- 多行注释
{% comment %} 内容 {% endcomment %} # 不用<!-- --> , comment更安全
- for
{% for 变量 in 列表 %} 语句1 {% empty %} 语句2 {% endfor %} # empty 意思为当列表为空或不存在时,执行empty之后的语句2
{% for h in hobby %} {% if forloop.first %} <li style="color: #ff1a3a">{{ forloop.counter }}:{{ h }}:{{ forloop.revcounter }}</li> {% elif forloop.last %} <li style="color: #1bff5d">{{ forloop.counter }}:{{ h }}:{{ forloop.revcounter }}</li> {% else %} <li>{{ forloop.counter }}:{{ h }}:{{ forloop.revcounter }}</li> {% endif %} {% empty %} <li>暂时没有消息</li> {% endfor %} # {{ forloop.counter }} 表示当前是第几次循环,从1数数 # {{ forloop.counter0}}表示当前是第几次循环,从0数数 # {{ forloop.revcounter}}表示当前是第几次循环,倒着数数,到1停 # {{ forloop.revcounter0}}表示当前第几次循环,倒着数,到0停 # {{ forloop.first }} 是否是第一个 布尔值 # {{ forloop.last }} 是否是最后一个 布尔值
- 模版中的点语法
- 字典查询
- 属性方法
- 索引
def index(request): data = { "msg": "VUE", "hobby": ["eat", "sleep", "gaming", "study", "reading"], "score":{ "en": 150, "ch": 105 }, "flag":False } # return render(request, "Index.html", context=data) template = loader.get_template('Index.html') result = template.render(context=data) # 渲染模版的两种方法 return HttpResponse(result) # data字典传递到模版中 <h1>{{ msg }}</h1> # 显示“msg”对应的value值:VUE <h3>{{ score.en }}</h3> # 显示”score"内"en"对应的value:150 <h2>{{ hobby.2 }}</h2> # 显示"hobby"的第二个索引值:gaming
反向解析
-
准备工作
-
在根urls中,include时添加namespace
-
在子urls中,添加name属性
-
-
使用
-
python中 reverse("namespace:name")
-
模板中 {% url 'namespace:name' %}
-
-
如果有参数
-
位置参数
-
python reverse('namespace:name', args=(value, value, value...))
-
模板中 {% url "namespace:name" value value ... %}
-
-
关键字参数
-
python reverse("namespace:name", kwargs={key:value, key:value})
-
兼容写法 reverser("namespace:name", args=(value, value...)) 不推荐
-
-
模板中
-
{% url "namespace: name" key=value key=value... %}
# 工程问价你的urls中 urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^two/', include('Two.urls', namespace="two")), ] # 项目文件的urls中 urlpatterns = [ url(r'^login/', views.login, name="login"), ] #模版中 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Login</title> </head> <body> <form action="{% url 'two:login' %}" method="post"> {% csrf_token %} #请求伪造 <input type="text" name="username" placeholder="请输入用户名"> <button>登录</button> </form> </body> </html>
CSRF
跨站请求伪造
某些恶意网站包含链接,表单,按钮,Js利用登陆用户在浏览器中的认证信息,进行非法操作,攻击服务,破坏数据
- 在表单中添加 {% csrf_token %}
- 在settings中的中间件MIDDLEWARE中配置打开 'django.middleware.csrf.CsrfViewMiddleware',注释掉这行
静态文件配置
在settings.py中最底下有一个叫做static的文件夹,主要用来加载一些模板中用到的资源,提供给全局使用
这个静态文件主要用来配置CSS,HTML,图片,字体文件等
STATIC_URL = '/static/' STATICFILES_DIRS = [ os.path.join(BASE_DIR,'static') ]
中间件
是一个轻量级的,底层的插件,可以介入Django的请求和相应过程(面向切面编程)
中间件的本质就是一个python类
面向切面编程(Aspect Oriented Programming)简称AOP。AOP的主要实现目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合的隔离效果。
- process_request(self,request):在执行视图前被调用,每个请求上都会调用,不主动进行返回或返回HttpResponse对象
- process_view(self,request,view_func,view_args,view_kwargs):调用视图之前执行,每个请求都会调用,不主动进行返回或返回HttpResponse对象
- process_template_response(self,request,response):在视图刚好执行完后进行调用,每个请求都会调用,不主动进行返回或返回HttpResponse对象
-
process_response(self,request,response):所有响应返回浏览器之前调用,每个请求都会调用,不主动进行返回或返回HttpResponse对象
- process_exception(self,request,exception):当视图抛出异常时调用,不主动进行返回或返回HttpResponse对象