Django基础二静态文件和ORM

1. 静态文件

写好后不会自动动态改变的文件资源,如CSS,js,图片,第三方框架文件等等都属于静态文件。默认我们会把静态文件都放在static目录下。这个目录在Django中是需要自己手动创建。

  1. 直接创建到项目的根目录下即可。
  2. static:
  3. |___css 存放css文件
  4. |___img 存放图片文件
  5. |___js 存放javaScript文件

把目录创建后启动Django是无法访问的,会报404,因为没有对外暴露访问接口,还需要在settings.py里面配置。

1.1 静态文件基本配置:

  1. 在项目同名目录下的settings.py文件
  2. 在下面会看到:
  3. """
  4. # Static files (CSS, JavaScript, Images)
  5. # https://docs.djangoproject.com/en/3.2/howto/static-files/
  6. STATIC_URL = '/static/'
  7. """
  8. STATIC_URL下面加一行:
  9. """
  10. STATICFILES_DIRS = [
  11. BASE_DIR / "static",
  12. ]
  13. """
  14. 即可。
  15. 而且里面可以加多个,如下:
  16. STATICFILES_DIRS = [
  17. BASE_DIR / "static",
  18. '/var/www/static/',
  19. ]
  20. 然后在HTML文件里配置css,js等配置文件
  21. <head>
  22. <script src="/static/bootstrap-3.4.1-dist/js/jquery-3.6.0.min.js"></script>
  23. <link href="/static/bootstrap-3.4.1-dist/css/bootstrap.min.css" rel="stylesheet">
  24. <script src="/static/bootstrap-3.4.1-dist/js/bootstrap.min.js"></script>
  25. </head>

1.2 静态文件进阶配置

  1. STATIC_URL = '/static/' # 接口前缀
  2. """
  3. 有了这个接口前缀,如果要访问静态文件资源,必须要static开头。
  4. 写了这个接口前缀之后,就拥有了访问STATICFILES_DIRS里面配置的目录内资源的权限。
  5. STATICFILES_DIRS = [
  6. BASE_DIR / "static",
  7. '/var/www/static/',
  8. ]
  9. 访问顺序为自上而下查找,找到后就返回
  10. """

STATIC_URL = '/static/' 在书写的时候必须要以static开头,如果更改了html里面也需要修改,否则访问不到。

  1. <script src="/static/bootstrap-3.4.1-dist/js/jquery-3.6.0.min.js"></script>
  2. <link href="/static/bootstrap-3.4.1-dist/css/bootstrap.min.css" rel="stylesheet">
  3. <script src="/static/bootstrap-3.4.1-dist/js/bootstrap.min.js"></script>
  4. 这里的static为接口前缀。

如果这里不想写成固定的,或者让它动态更新,这样不管``STATIC_URL = '/xxx/' `写成什么都可以访问到这些静态文件。

方法:

  1. HTML文件里:
  2. 增加:
  3. {% load static %}
  4. <script src="{% static 'xx/yy/zz.js'%}"></script>
  5. 示例:
  6. {% load static %}
  7. <script src="{% static 'bootstrap-3.4.1-dist/js/jquery-3.6.0.min.js'%}"></script>
  8. <link href="{% static 'bootstrap-3.4.1-dist/css/bootstrap.min.css' %}" rel="stylesheet">
  9. <script src="{% static 'bootstrap-3.4.1-dist/js/bootstrap.min.js' %}"></script>
  10. <img src="{% static 'my_app/example.jpg' %}" alt="My image">
  11. settings.py里配置:
  12. STATIC_URL = '/static/' # 这时这里的static可以随意改名了
  13. STATICFILES_DIRS = [
  14. BASE_DIR / "static",
  15. ]

2. request参数

views.py文件里写的函数都要带一个request参数,这个具体是做什么的?

先写一个登录页面:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
  7. <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
  8. <script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
  9. </head>
  10. <body>
  11. <div class="container">
  12. <div class="row">
  13. <p class="text-center">登录</p>
  14. <div class="col-md-8 col-md-offset-2">
  15. <form action="" method="post">
  16. username:<input type="text" name="name" class="form-control">
  17. password:<input type="password" name="pwd" class="form-control">
  18. <input type="submit" value="提交" class="btn btn-success btn-block">
  19. </form>
  20. </div>
  21. </div>
  22. </div>
  23. </body>
  24. </html>
  25. # <form action="" method=""> action不写默认向自己这个页面提交,method不写得使用get方法提交。get方法提交就会把输入的内容直接显示在浏览器上。所以一般使用post方法提交。由于没写处理post的方法,所以这里会报错:
  26. Forbidden (403)
  27. CSRF verification failed. Request aborted.

临时解决方法:

  1. settings.py里面找到MIDDLEWARE,然后把csrf相关的注释掉
  2. MIDDLEWARE = [
  3. #'django.middleware.csrf.CsrfViewMiddleware',
  4. ]

现在访问这个页面不管是get请求还是post请求,都向这个页面提交,但是使用get请求的时候,拿到这个页面,使用post请求返回:"OK,已提交"

  1. # view.py文件:
  2. from django.shortcuts import render
  3. def login(request):
  4. print(request.method)
  5. return render(request,'login.html')
  6. 打印后发现,
  7. get请求会打印一个全大写的:GET
  8. post请求打印一个全大写的:POST
  9. 所以可以根据这个来判断请求的不同,返回的内容不同
  10. 代码如下:
  11. from django.shortcuts import render,HttpResponse
  12. # Create your views here.
  13. def login(request):
  14. if request.method == 'POST':
  15. return HttpResponse("OK,已提交")
  16. return render(request,'login.html')

如何拿到用户提交过来的数据

  1. # views.py
  2. from django.shortcuts import render,HttpResponse
  3. # Create your views here.
  4. def login(request):
  5. if request.method == 'POST':
  6. # 获取用户提交的数据
  7. print(request.POST)
  8. username = request.POST.get('name')
  9. password = request.POST.get('pwd')
  10. print(username, password)
  11. return HttpResponse("OK,已提交")
  12. return render(request,'login.html')
  13. 上面的方法虽然可以拿到数据,但是有个小问题,就是多选的时候使用get方法只能拿到最后个。如果想要拿到全部,则要使用.getlist()
  14. 示例:
  15. <html>
  16. <form action="" method="post">
  17. username:<input type="text" name="name" class="form-control">
  18. password:<input type="password" name="pwd" class="form-control">
  19. <input type="checkbox" name="hobby" value="read">read
  20. <input type="checkbox" name="hobby" value="jump">jump
  21. <input type="checkbox" name="hobby" value="speak">speak
  22. <input type="submit" value="提交" class="btn btn-success btn-block">
  23. </form>
  24. </html>

  1. 拿到数据:
  2. # views.py
  3. from django.shortcuts import render,HttpResponse
  4. # Create your views here.
  5. def login(request):
  6. if request.method == 'POST':
  7. # 获取用户提交的数据
  8. print(request.POST)
  9. username = request.POST.get('name')
  10. password = request.POST.get('pwd')
  11. hobby = request.POST.get('hobby')
  12. print(username, password, hobby)
  13. return HttpResponse("OK,已提交")
  14. return render(request,'login.html')
  15. # 结果:
  16. hello 123 speak
  17. 发现只拿到了speak这一个,前面的readjump没有拿到。如果要拿到就要使用.getlist()
  18. # views.py
  19. from django.shortcuts import render,HttpResponse
  20. # Create your views here.
  21. def login(request):
  22. if request.method == 'POST':
  23. # 获取用户提交的数据
  24. print(request.POST)
  25. username = request.POST.get('name')
  26. password = request.POST.get('pwd')
  27. hobby = request.POST.getlist('hobby')
  28. print(username, password, hobby)
  29. return HttpResponse("OK,已提交")
  30. return render(request,'login.html')
  31. # 执行后拿到的数据:
  32. hello 123 ['read', 'jump', 'speak']

上传文件

  1. 上传文件需要一个前提:
  2. form里面必须有enctype参数
  3. <form action="" method="post" enctype="multipart/form-data">
  4. <input type="file" name="file">
  5. </form>
  6. views.py:
  7. from django.shortcuts import render,HttpResponse
  8. # Create your views here.
  9. def login(request):
  10. if request.method == 'POST':
  11. #data = request.FILES.get('file')
  12. data = request.FILES.getlist('file')
  13. print(data)

目前request方法:

  1. request.method 获取当前请求方法,并结果是一个纯大写的字符串
  2. request.POST 获取用户post请求过来的基本数据(不包含文件)
  3. get() 拿到最后一个元素
  4. getlist() 拿到全部元素
  5. request.GET 获取用户get请求过来的基本数据
  6. get() 拿到最后一个元素
  7. getlist() 拿到全部元素

3. Django配置数据库

  1. 具体文档:
  2. https://docs.djangoproject.com/en/3.2/ref/settings/#databases
  3. 配置:
  4. settings.py里面找到DATABASES,把默认配置修改了:
  5. # DATABASES = {
  6. # 'default': {
  7. # 'ENGINE': 'django.db.backends.sqlite3',
  8. # 'NAME': BASE_DIR / 'db.sqlite3',
  9. # }
  10. # }
  11. DATABASES = {
  12. 'default': {
  13. 'ENGINE': 'django.db.backends.mysql', # MySQL的驱动程序
  14. 'NAME': 'firstDjango', # 数据库名
  15. 'USER': 'root', # 数据库登录用户名
  16. 'PASSWORD': '123456', # 登录密码
  17. 'HOST': '192.168.1.109', # 登录ip
  18. 'PORT': '3306', # 端口
  19. }
  20. }
  21. 配置完后启动Django 项目发现会报错:
  22. django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module.
  23. Django默认使用MySQLDB这个模块连接MySQL数据库,现在我们使用pymysql模块,所以要使用PyMySQL模块替换掉MySQLDB,方法:
  24. 在项目目录下的__init__.py 应用目录里面的__init__.py 文件里添加:
  25. __init__.py文件:
  26. import pymysql
  27. pymysql.install_as_MySQLdb()
  28. 就可以解决,然后启动。
  29. 修改地方:
  30. 例如项目名是firstDjango,应用名是first
  31. firstDjango
  32. |- __init__.py
  33. first
  34. |- __init__.py
  35. 这两个地方任意一个文件里修改都可以。

4. Django ORM

ORM:对象关系映射

  1. ————>
  2. 对象 ————> 表里面的数据
  3. 对象点属性 ————> 字段对应的值
  4. 优点是:不懂SQL语句也能操作数据库
  5. 缺点: 封装了SQL语句,执行速度比较慢。

4.1 创建表

Django里操作数据库要写在应用的models.py文件里。

  1. 使用Django在数据库里里创建一个表:
  2. 第一步: 写创建语句代码:
  3. # models.py
  4. """
  5. from django.db import models
  6. # Create your models here.
  7. class User(models.Model):
  8. # 相当于id int primary key auto_increment
  9. id = models.AutoField(primary_key=True)
  10. # 相当于 name(varchar(32)) CharField必须有个max_length的参数
  11. name = models.CharField(max_length=32)
  12. # age int
  13. age = models.IntegerField()
  14. """
  15. 第二步,数据库迁移:
  16. """
  17. 数据库迁移命令:
  18. 1. 将数据据先记录到migrations目录下。
  19. python3 manage.py makemigrations
  20. 2. 真正执行数据库迁移操作。
  21. python3 manage.py migrate
  22. *** 只要是动了models.py里面和数据库相关的代码就要执行一下上面的两条命令
  23. """

如果不指定主键,ORM则会主动创建一个id的主键,如果不想让主键字段叫id,自己可以手动指定。

4.2 增加字段

  1. # 增加字段:
  2. # 如增加一个password字段。
  3. class User(models.Model):
  4. id = models.AutoField(primary_key=True)
  5. name = models.CharField(max_length=32verbose_name='用户名')
  6. password = models.CharField(max_length=32,verbose_name='密码') #
  7. age = models.IntegerField()
  8. """
  9. verbose_name='xx' 增加一个注释,可以写中文
  10. 写完后执行:
  11. python3 manage.py makemigrations
  12. python3 manage.py migrate
  13. 执行的时候会提示:
  14. Provide a one-off default now (will be set on all existing rows with a null value for this column)
  15. 就是新加的字段,是否能为空,或设置一个默认值,解决方法有两种
  16. """
  17. # 方法一,属性为空:
  18. password = models.CharField(max_length=32,verbose_name='密码', null=True)
  19. # 方法二,设置默认值
  20. password = models.CharField(max_length=32,verbose_name='密码',default='123456')

4.3 修改字段:

  1. # 原代码:
  2. """
  3. class User(models.Model):
  4. id = models.AutoField(primary_key=True)
  5. name = models.CharField(max_length=32,verbose_name='用户名')
  6. password = models.CharField(max_length=32,verbose_name='密码') #
  7. age = models.IntegerField()
  8. """
  9. # 修改后:
  10. """
  11. class User(models.Model):
  12. id = models.AutoField(primary_key=True)
  13. name = models.CharField(max_length=64,verbose_name='用户名')
  14. password = models.CharField(max_length=32,verbose_name='密码') #
  15. age = models.IntegerField()
  16. """
  17. 然后执行:
  18. python3 manage.py makemigrations
  19. python3 manage.py migrate

4.4 删除字段

  1. # 删除字段,直接把字段在代码里注释即可:
  2. """
  3. class User(models.Model):
  4. id = models.AutoField(primary_key=True)
  5. name = models.CharField(max_length=64,verbose_name='用户名')
  6. password = models.CharField(max_length=32,verbose_name='密码') #
  7. #age = models.IntegerField()
  8. """
  9. 然后执行:
  10. python3 manage.py makemigrations
  11. python3 manage.py migrate

4.5 查询数据

登录的时候从数据库校验,如果用户名和密码正确,提示登录成功。

  1. 应用目录下:
  2. # views.py
  3. from django.shortcuts import render,HttpResponse
  4. from first import models
  5. # Create your views here.
  6. def login(request):
  7. if request.method == 'POST':
  8. # 获取用户提交的数据
  9. print(request.POST)
  10. username = request.POST.get('name')
  11. password = request.POST.get('pwd')
  12. # select * from user where name='用户输入的登录名' and password='用户输入的密码'
  13. user_obj = models.User.objects.filter(name=username,password=password).first()
  14. #上面返回了一个对象方法,对象在调用的时候会执行__str__函数,所以在models.py里加上这个函数
  15. print(user_obj)
  16. if user_obj:
  17. return HttpResponse("登录成功")
  18. return render(request,'login.html')
  19. # models.py
  20. from django.db import models
  21. # Create your models here.
  22. class User(models.Model):
  23. # 相当于id int primary key auto_increment
  24. id = models.AutoField(primary_key=True)
  25. # 相当于 name(varchar(32)) CharField必须有个max_length的参数
  26. name = models.CharField(max_length=32)
  27. password = models.CharField(max_length=32)
  28. # age int
  29. age = models.IntegerField()
  30. def __str__(self):
  31. return self.name

4.6 插入数据

用户注册

第一:先准备注册页面

  1. templates目录下:
  2. <!DOCTYPE html>
  3. <html lang="en">
  4. <head>
  5. <meta charset="UTF-8">
  6. <title>Title</title>
  7. <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
  8. <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
  9. <script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
  10. </head>
  11. <body>
  12. <div class="container">
  13. <div class="row">
  14. <p class="text-center">注册</p>
  15. <div class="col-md-8 col-md-offset-2">
  16. <form action="" method="post" enctype="multipart/form-data">
  17. username:<input type="text" name="name" class="form-control">
  18. password:<input type="password" name="pwd" class="form-control">
  19. <input type="submit" value="提交" class="btn btn-warning btn-block">
  20. </form>
  21. </div>
  22. </div>
  23. </div>
  24. </body>
  25. </html>

第二,编写用户注册代码

  1. # 应用目录下views.py
  2. from django.shortcuts import render,HttpResponse
  3. from first import models
  4. def res(request):
  5. if request.method == 'POST':
  6. # 获取用户提交的数据
  7. print(request.POST)
  8. username = request.POST.get('name')
  9. password = request.POST.get('pwd')
  10. # 写入数据库
  11. # 不考虑验证用户是否存在
  12. models.User.objects.create(name=username, password=password)
  13. return HttpResponse("注册成功")
  14. return render(request, 'res.html')

第三,路由和视图函数对应

  1. 项目名目录下:
  2. # urls.py
  3. from first import views as views
  4. urlpatterns = [
  5. path('admin/', admin.site.urls),
  6. path('login/', views.login),
  7. path('res/', views.res),
  8. ]

第四,重启Django项目

  1. python manage.py runserver

4.7 查看全部数据

要把用户的数据全部展示到页面:

  1. 一,准备展示页:
  2. #templates目录下home.html:
  3. <table class="table table-striped table-hover">
  4. <thead>
  5. <tr>
  6. <th>id</th>
  7. <th>name</th>
  8. <th>pwd</th>
  9. </tr>
  10. </thead>
  11. <tbody>
  12. {% for foo in userdata %}
  13. <tr>
  14. <td class="success">{{ foo.id }}</td>
  15. <td class="warning">{{ foo.name }}</td>
  16. <td class="danger">{{ foo.password }}</td>
  17. </tr>
  18. {% endfor %}
  19. </tbody>
  20. </table>
  21. 二,编写获取全部用户信息代码:
  22. # 应用名目录下views.py
  23. from django.shortcuts import render,HttpResponse
  24. from first import models
  25. def home(request):
  26. user_obj = models.User.objects.all()
  27. # select * from user;
  28. return render(request, 'home.html', {'userdata':user_obj})
  29. 三, 路由和视图函数对应关系:
  30. # 项目名下urls.py
  31. from first import views as views
  32. urlpatterns = [
  33. path('admin/', admin.site.urls),
  34. path('login/', views.login),
  35. path('res/', views.res),
  36. path('home/', views.home),
  37. ]
  38. 四,重启Django项目
  39. python manage.py runserver

4.8 利用页面编辑数据库里数据

  1. 一,准备展示页:
  2. <table class="table table-striped table-hover">
  3. <thead>
  4. <tr>
  5. <th>编号</th>
  6. <th>姓名</th>
  7. <th>密码</th>
  8. <th>操作</th>
  9. </tr>
  10. </thead>
  11. <tbody>
  12. {% for foo in userdata %}
  13. <tr>
  14. <td class="success">{{ foo.id }}</td>
  15. <td class="warning">{{ foo.name }}</td>
  16. <td class="danger">{{ foo.password }}</td>
  17. <td colspan="info">
  18. <a href="/edit?edit_id={{ foo.id }}">编辑</a>
  19. <a href="/delete?delete_id={{ foo.id }}">删除</a>
  20. </td>
  21. </tr>
  22. {% endfor %}
  23. </tbody>
  24. </table>
  25. 二,编写获取全部用户信息代码:
  26. # 应用名目录下views.py
  27. def show(request):
  28. user_obj = models.User.objects.all()
  29. return render(request, 'show.html', {'userdata':user_obj})
  30. def edit(request):
  31. edit_id = request.GET.get('edit_id')
  32. edit_obj = models.User.objects.filter(id=edit_id).first()
  33. if request.method == 'POST':
  34. username = request.POST.get('name')
  35. password = request.POST.get('pwd')
  36. # 修改数据方法一:
  37. models.User.objects.filter(id=edit_id).update(name=username, password=password)
  38. # 修改数据方法二:
  39. # edit_obj.name=username
  40. # edit_obj.password=password
  41. # edit_obj.save()
  42. return redirect('/show/')
  43. return render(request, 'edit.html', {"edit_obj":edit_obj})
  44. 三, 路由和视图函数对应关系:
  45. # urls.py
  46. from first import views as views
  47. urlpatterns = [
  48. path('admin/', admin.site.urls),
  49. path('login/', views.login),
  50. path('res/', views.res),
  51. path('home/', views.home),
  52. path('show/', views.show),
  53. path('edit/', views.edit),
  54. ]
  55. 四,重启Django项目
  56. python manage.py runserver

4.9 利用页面删除数据库里数据

  1. 一,准备展示页:
  2. 同上页面:
  3. <a href="/delete?delete_id={{ foo.id }}">删除</a>
  4. 二,编写获取全部用户信息代码:
  5. # 应用名目录下views.py
  6. def delete(request):
  7. delete_id = request.GET.get('delete_id')
  8. models.User.objects.filter(id=delete_id).delete()
  9. return redirect("/show")
  10. 三, 路由和视图函数对应关系:
  11. # 项目名下urls.py
  12. from first import views as views
  13. urlpatterns = [
  14. path('admin/', admin.site.urls),
  15. path('login/', views.login),
  16. path('res/', views.res),
  17. path('home/', views.home),
  18. path('show/', views.show),
  19. path('edit/', views.edit),
  20. path('delete/', lviews.delete),
  21. ]
  22. 四,重启Django项目
  23. python manage.py runserver

4.10 同步数据库

如果数据库已经有一些表了,如何通过Django ORM操作?

  1. 如果已经创建了一个库,并且里面有一些表。现在Django要用到这个库和里面的表,如何利用Django操作已经存在的表。
  2. 一,使用inspectdb命令,它可以通过已存在的数据库创建对应模型。
  3. python3 manage.py inspectdb # 后面什么都不写,则把库中全部表的对应模型都输出。
  4. python3 manage.py inspectdb 表名 # 只输出某一个表
  5. python3 manage.py inspectdb first_user
  6. """
  7. class FirstUser(models.Model):
  8. name = models.CharField(max_length=32)
  9. password = models.CharField(max_length=32)
  10. class Meta:
  11. managed = False
  12. db_table = 'first_user'
  13. 把上面的代码保存到models.py里面
  14. """
  15. 二,执行这两个命令:
  16. python3 manage.py makemigrations
  17. python3 manage.py migrate #会初始化创建一些Django用到的表。

4.11 ORM创建外键

  1. # ORM 针对外键字段的创建位置
  2. """
  3. 一对多: 推荐建在多的一方
  4. 多对多:建在哪一方都可以,但推荐建在查询频率较高的表中
  5. 一对一: 建在哪一方都可以,但推荐建在查询频率较高的表中
  6. """
  7. # 应用名目录下models.py
  8. from django.db import models
  9. # Create your models here.
  10. class User(models.Model):
  11. id = models.IntegerField(blank=True, primary_key=True)
  12. name = models.CharField(max_length=255, blank=True, null=True)
  13. age = models.IntegerField(blank=True, null=True)
  14. class Meta:
  15. managed = True
  16. db_table = 'user'
  17. # 创建书籍表
  18. class Book(models.Model):
  19. title = models.CharField(max_length=32)
  20. # 共8位,小数占2位
  21. price = models.DecimalField(max_digits=8, decimal_places=2)
  22. # 出版社外键(Django会在外键字段后面自动加_id后缀)
  23. publish = models.ForeignKey(to='Publish',on_delete=models.CASCADE)
  24. # 作者外键
  25. authors=models.ManyToManyField(to='Author')
  26. # 出版社表
  27. class Publish(models.Model):
  28. title = models.CharField(max_length=32)
  29. email = models.EmailField()
  30. # 作者表
  31. class Author(models.Model):
  32. name = models.CharField(max_length=32)
  33. age = models.IntegerField
  34. #作者详细表外键(在外键字段后面自动加_id后缀)
  35. author_detail = models.OneToOneField(to='AuthorDetail',models.CASCADE)
  36. # 作者详细表
  37. class AuthorDetail(models.Model):
  38. phone = models.BigIntegerField()
  39. addr = models.CharField(max_length=128)
  40. //ForeignKey和OneToOneField使用的时候必须要传两个参数:
  41. toon_delete,to就是上面写的哪个表创建外键。
  42. on_delete为:
  43. CASCADE 级联删除
  44. PROTECT
  45. RESTRICT (New in Django 3.1.)
  46. SET_NULL
  47. SET_DEFAULT
  48. SET() ForeignKey 设置为传递给 SET() 的值,如果传递了一个可调用的值,则为调用它的结果。
  49. DO_NOTHING 不采取任何行动
  50. 具体见:https://docs.djangoproject.com/zh-hans/3.2/ref/models/fields/#django.db.models.ForeignKey.on_delete

Django基础二静态文件和ORM的更多相关文章

  1. day 66 Django基础二之URL路由系统

    Django基础二之URL路由系统   本节目录 一 URL配置 二 正则表达式详解 三 分组命名匹配 四 命名URL(别名)和URL反向解析 五 命名空间模式 一 URL配置 Django 1.11 ...

  2. day 53 Django基础二之URL路由系统

    Django基础二之URL路由系统   本节目录 一 URL配置 二 正则表达式详解 三 分组命名匹配 四 命名URL(别名)和URL反向解析 五 命名空间模式 一 URL配置 Django 1.11 ...

  3. Django中对静态文件的支持(转)

    英文原文:[http://agiliq.com/blog/2013/03/serving-static-files-in-django/] 译文:[http://segmentfault.com/a/ ...

  4. Django (七) token&静态文件&媒体文件

    token&静态文件&媒体文件 1. token 1. 会话技术 2. 服务端会话技术 3. 它实际上就是手动实现的session 4. 实现token 4.1 在models.py中 ...

  5. django中的静态文件

    静态文件 1.什么是静态文件 在django中静态文件是指那些图片.css样式.js样式.视频.音频等静态资源. 2.为什么要配置静态文件 这些静态文件往往不需要频繁的进行变动,如果我们将这些静态文件 ...

  6. Django框架之模板基础,静态文件配置

    一.模板继承 目的是:减少代码的冗余 语法: {% block classinfo %} {% endblock %} 具体步骤: 1.创建一个base.html文件,2.把要显示的页面的内容写在这里 ...

  7. day52_9_16Django中的静态文件和orm

    一.静态文件配置 在配置静态文件时,需要创建一个文件夹在Django项目文件夹下,名字与使用无关. 静态文件包括html等使用的不会变动的插件文件等.分为三个部分: css文件夹 当前网站所有的样式文 ...

  8. Django基础(二):环境配置

    前戏 WEB框架简介 具体介绍Django之前,必须先介绍WEB框架等概念. web框架: 别人已经设定好的一个web网站模板,你学习它的规则,然后“填空”或“修改”成你自己需要的样子. 一般web框 ...

  9. 2.Django|简介与静态文件| URL控制器

    1.简介  MVC Web服务器开发领域里著名的MVC模式,所谓MVC就是把Web应用分为模型(M),控制器(C)和视图(V)三层,他们之间以一种插件式的.松耦合的方式连接在一起,模型负责业务对象与数 ...

随机推荐

  1. 异步回调实现- Guava Retryer

    为什么要使用重试利器Retryer 在实际开发中我们经常会遇到需要轮询查询一个接果,实现轮询的方式有很多种,我们经常要写许多代码,有时还会怕写出的代码有bug,如果已经有轮子了,我们就没必要重复造轮子 ...

  2. jsp include html 乱码问题

    感谢大佬:https://blog.csdn.net/sessionsong/article/details/38778853 在使用<%@ include page=""% ...

  3. 一行代码轻松修改 Text Field 和 Text View 的光标颜色 — By 昉

    众所周知,Text Field 和 Text View 的光标颜色默认都是系统应用的那种蓝色,如图: 而在实际开发中为了让视觉效果更统一,我们可能会想把那光标的颜色设置成和界面色调一致的颜色.其实在 ...

  4. Python—列表元组和字典

    Python-列表元组和字典 列表 元组 字典 列表: 列表是Python中的一种数据结构,他可以存储不同类型的数据.尽量存储同一种类型 列表索引是从0开始的,我们可以通过索引来访问列表的值. 列表的 ...

  5. pycharm关闭pytest

    在pycharm中,如果py文件以 test 开头,则运行时会使用pytest执行,pycharm关闭pytest方式如下 File -> Settings -> Tools -> ...

  6. 5道面试题,拿捏String底层原理!

    原创:微信公众号 码农参上,欢迎分享,转载请保留出处. String字符串是我们日常工作中常用的一个类,在面试中也是高频考点,这里Hydra精心总结了一波常见但也有点烧脑的String面试题,一共5道 ...

  7. Spring Security即将弃用WebSecurityConfigurerAdapter配置类

    用过WebSecurityConfigurerAdapter的都知道对Spring Security十分重要,总管Spring Security的配置体系.但是马上这个类要废了,你没有看错,这个类将在 ...

  8. AfterLogicWebMail CSRF导致密码可修改

    实验目的 了解CSRF漏洞导致Webmail管理员帐号密码任意被修改 实验原理 当我们打开或者登陆某个网站的时候,浏览器与网站所存放的服务器将会产生一个会话(cookies),在这个会话没有结束时,你 ...

  9. Spring系列22:Spring AOP 概念与快速入门篇

    本文内容 Spring AOP含义和目标 AOP相关概念 声明式AOP快速入门 编程式创建代理对象 Spring AOP含义和目标 OOP: Object-oriented Programming 面 ...

  10. Kubernetes云供应商架构的未来

    首先,我想分享SIG的使命,因为我们用它来指导我们现在和将来的工作.从我们的章程中直接来看,SIG的使命是简化,开发和维护云供应商集成,作为Kubernetes集群的扩展或附加组件.这背后的动机是双重 ...