django
新增环境
1 | apt install python3-venv |
安装Django
1 | pip install django -i http://pypi.douban.com/simple/ --trusted-host=pypi.douban.com/simple |
创建和初始化项目
创建
1 | django-admin startproject mysite |
修改settings文件
1 | import os # 新增 |
新增文件夹
1 | mkdir 项目目录/templates 项目目录/static |
自定义用户模型
新建一个app
1 | python manage.py startapp manager |
注册到settings.py中
1 | INSTALLED_APPS = [ |
修改manager/models.py,根据自己的需要修改
1 | from django.db import models |
编辑settings.py文件
1 | # 新增自定义用户模型 |
数据库迁移
1 | #生成迁移文件 |
创建用户
-
管理员用户
1 | python manage.py createsuperuser |
-
普通用户进入项目shell
1 | python manage.py shell |
1 | from django.contrib.auth.models import User(用户数据库,默认为User,如果自定义了这里需要修改) |
站点验证和登录
除了指定界面,用户访问其他界面时,如果没有登录就跳到登录界面,登录完成后跳转到需要访问的界面比如用户访问:https://51yunwei.top/system/ ,会跳转为 https://51yunwei.top/login/?next=/system/,完成登录后,跳转回https://51yunwei.top/system/
此处代码来自运维咖啡吧,通过中间件的方式进行处理
-
新建一个目录
1 | mkdir system/middleware -p |
-
编辑loginrequired.py文件
1 | from django.shortcuts import redirect |
OPEN_URLS:不需要验证就能访问到的界面
LOGIN_URL:需要验证才能访问到的界面通过在settings中配置变量实现
-
编辑settings文件
1 | MIDDLEWARE = [ |
在登录的函数中拿到next地址,并返回,如下
1 | class LoginView(View): |
返回函数
一些常见的视图返回函数的导入方式:
-
HttpResponse
:这是一个Django内置的HTTP响应类,可以直接从django.http
模块导入。
1 | from django.http import HttpResponse |
-
HttpResponseRedirect
:这也是一个Django内置的HTTP响应类,可以直接从django.http
模块导入。
1 | from django.http import HttpResponseRedirect |
-
render
:这是一个用于渲染模板并返回HTTP响应的函数,可以从django.shortcuts
模块导入。
1 | from django.shortcuts import render |
-
redirect
:这是一个用于返回重定向视图的函数,也可以从django.shortcuts
模块导入。
1 | from django.shortcuts import redirect |
-
JsonResponse
:这是一个用于返回JSON格式HTTP响应的函数,可以从django.http
模块导入。
1 | from django.http import JsonResponse |
-
Response
:这是Django REST Framework中的一个函数,用于返回HTTP响应,需要从rest_framework.response
模块导入。
1 | from rest_framework.response import Response |
-
reverse
1 | from django.urls import reverse |
设置url
在项目根urls.py中配置
1 | from django.contrib import admin |
1 | from django.urls import path |
使用url模板标签生成路径
-
在url中配置name
1 | urlpatterns = [ |
-
在前端文件使用
1 | <a href="{% url 'userlist' %}" class="nav-link"> |
-
如果有多个相同名称的name,可以在urls.py中设置一个app_name来区分
1 | # manager/urls.py |
1 | <a href="{% url 'manager:userlist' %}" class="nav-link"> |
获取post数据
获取post数据
1 | username = request.POST.get('username','') |
在post方法中也可以用GET
1 | def post(self,request): |
登录和退出登录和session
-
登录和session
1 | from django.contrib.auth import authenticate,login,logout |
-
退出登录
1 | from django.contrib.auth import authenticate,login,logout |
设置密码和检查密码
设置密码使用set_password
1 | user.set_password('xxxx') |
检查密码是否和输入的一致
1 | from django.contrib.auth.hashers import check_password |
上传到github
1、生成requirements.txt文件
1 | pip freeze > ./requirements.txt文件 |
设置全局可使用的变量
在template中,我们可以直接使用request变量,现在我们来设置一下可以直接使用的自定义变量
system/systeminfo.py
1 | from manager.models import SystemInfoDB |
manager/models.py
1 | class SystemInfoDB(models.Model): |
1 | TEMPLATES = [ |
这样就可以直接在html中使用这个变量了
1 | <title>{{ systeminfo.system_title }}</title> |
adminlte
点击菜单加载页面后,菜单没有高亮
在base.html添加以下代码
1 | <script> |
优化版:比如用户管理一个菜单,里面有编辑用户、查看用户等,url为/user/xxxx/edit/、/user/xxx/detail/,这样的话上面的方法就不管用了,因为菜单是/user/,匹配不到/user/xxx/edit/,所以修改如下:
1 | <script> |
data-widget属性
AdminLTE框架中就使用data-widget属性来激活一些插件,如iframe插件、todo list插件等。
以下是一个使用data-widget属性的例子:
1 | <div class="col-lg-6" id="calendar_widget" data-widget="chat-init"></div> |
在这个例子中,data-widget="chat-init"表示激活了一个名为"chat-init"的插件。
需要注意的是,data-widget属性并不是Bootstrap的标准属性,而是一些第三方框架(如AdminLTE)扩展出来的属性。因此,如果你在使用这些框架时遇到data-widget属性,可以参考相应的文档来了解其具体用法。
ajax提交数据
html代码如下
1 | <form id="editUserForm" novalidate="novalidate"> |
ajax代码:
1 | $("#editUserForm button[type='submit']").click(function(e){ |
python代码
1 | def post(self,request,uid): |
吐司
引入文件
1 | <!-- toastr需要导入的css文件 --> |
初始化
1 | var Toast = Swal.mixin({ |
返回上一个url
1 | <a href="javascript:history.go(-1);"> |
在datatable头添加一个按钮,和search平行
1 | <script> |
post后url显示参数,如何修改?
1 | <!-- 在form标签增加以下字段 --> |
提交数据后,通过request.POST获取不到
前端post后,django是通过标签中的name='xxx’获取到数据的,比如,后端通过reqeust.POST.get(‘username’)获取数据所以template一定要设置name属性
自定义模态框的内容
模态框html,id为mymodal
1 | <!-- 模态框 --> |
js代码
1 | // 这里用的是模态框的id |
按钮的html只要设置了data-toggle="modal" data-target="#mymodal"
就行,其中data-target
是要弹出的模态框
1 | <a class="nav-link" href="/logout/" role="button" id="logoutbtn" data-toggle="modal" data-target="#mymodal"> |
jQuery表单校验
1 | <script src="{% static 'adminlte/plugins/jquery-validation/jquery.validate.min.js' %}"></script> |
使用datatable
html代码
1 | <table id="usertable" class="table table-bordered table-striped"> |
js代码
1 | $(function () { |
后端代码,返回的格式UserDict[“data”],data要和js的columns data名称一致
1 | def UserIndex(request): |
1 | path('user/',views.UserIndex,name='userindex'), |
刷新datatable的数据
1 | $('#usertable').DataTable().ajax.reload(); |
截断datatable数据
使用DataTables提供的ellipsis插件,它专门用于文本的截断显示。这个插件可以对过长的文本进行截断,并在结尾添加省略号。使用这个插件非常简单,首先需要在HTML中引入相应的JS文件:
1 | <script src="https://cdn.datatables.net/plug-ins/1.11.3/dataRender/ellipsis.js"></script> |
然后在DataTables的配置中使用render.ellipsis方法:
1 | $('#example').DataTable({ |
bootstrap-switch监听按钮变化事件
1 | $("#userstat_value").on('switchChange.bootstrapSwitch', function (event,state) { |
文件上传
html
1 | <!-- 不在form表单中 --> |
js文件
1 | <script src="{% static 'adminlte/plugins/bs-custom-file-input/bs-custom-file-input.js' %}"></script> |
ace编辑器
引入
1 | <!-- 地址 --> |
使用
1 | <div class="form-group"> |
1 | // ACE配置 |
js换行
1 | var multiLineString = `这是第一行 |