本篇文章主要介绍django的重定向和反向解析以及静态资源配置和模型继承的相关知识
重定向
重定向(Redirect)就是通过各种方法将各种网络请求重新定个方向转到其它位置
HttpResponseRedirect
是HttpResponse
的⼦类,可以完成⻚⾯的重定向- 设置重定向我们可以使用
redirect
(是HttpResponseRedirect的简写)
例如:
urls.py:
urlpatterns = [
path('index/<int:num>', views.index),
path('test/', views.test)
]
views.py:
def index(request, num):
return HttpResponse(f'参数是:{num}')
def test(request):
return redirect('/one/index/3', permanent=True)
让我们访问/one/test/的时候就会自动301重定向到/one/index/3
- 这里redirect第二个参数默认为
False
表示302临时重定向, Ture
表示301永久重定向。- 这是对于搜索引擎来区别是否抓取原页面的,对于我们没有什么影响
反向解析
首先我们要在urls.py
里定义namespace
命名空间,并设置子路由的name
app_name = 'one'
urlpatterns = [
path('index/<int:num>', views.index, name='index'),
path('test/', views.test, name='test')
]
然后在views.py
创建对应的方法使其渲染我们的html文件
def index(request, num):
return HttpResponse(f'参数是:{num}')
def test(request):
return render(request, '反向解析test.html', locals())
然后我们在html文件中创建一个a
标签:
<h1>
<a href="{% url 'one:index' 6 %}">点我跳转至index,参数为6</a>
</h1>
- 动态⽣成路由地址带参的跳转
- 冒号前面是命名空间,后面是子路由的name,注意用引号引起来 后面可跟对应的参数
为什么要用反向代理而不直接写相对路径呢?
- 因为可能以后随着项目的完善原来的要跳转的文件移动到了别处,这样就不需要修改所有的路径,而直接使用反向解析不管移动到哪里都可以通过
命名空间:名字
找到对应的html文件
静态资源配置
- 要是用像js,css,图片等需要从外部导入资源
- 首先创建static目录
- 然后再settings中注册:
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR,'static')
]
然后将静态文件放到static中就可以在html中引用了:
{% load static %}
<img src="{% static 'test.png' %}" alt="test image">
模型继承
- django中的模型支持继承
- 默认的继承时会将通用的字段放到父表中,特定字段放到自己的表中,中间使用外键连接
不好,因为关系型数据库关系越复杂,效率越低,查询越慢。父类表中也会存储过多的数据 - 使用元信息来解决这个问题
使模型抽象化。抽象的模型就不会在数据库中产生映射。子模型映射出来的表直接包含父模型的字段。
例如我们创建一个模型:
class Animals(models.Model):
a_name = models.CharField(max_length=16)
class Meta:
abstract = True
class Cat(Animals):
c_eat = models.CharField(max_length=20)
class Dog(Animals):
d_leg = models.IntegerField(default=4)
注意这里的Animial类中的元信息中定义改模型为抽象模型,然后下面的类继承于改抽象模型。
然后我们进行迁移和映射,在生成迁移文件的时候我们就可以发现这里只生成了了两个模型,因为抽象模型使不被生成的
通过查看cat表的DDL可以发现它并没有使用外键,子模型映射出来的表直接包含父模型的字段。