Django精品散装知识点
创建超级用户
python3 manage.py createsuperuser username
修改密码
python3 manage.py changepassword username
安装django2.1环境并运行
pip3 install django==2.1
django-admin startproject qfsite
python3 manage.py runserver
django-admin startapp users
两种传参方式
/user/?user=1001/ get方法传参
/user/1001/ django的路由传参
settings.py中加入,路径信息
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(file)))
放在urls.py文件中
from django.urls import path,re_path,register_converter,include
path-->路由路径获取,例如:
path('<str:uid>/', views.users_detail),
re_path-->正则匹配路径,例如:
re_path(r'^(?P<name>[a-z]+)/$', views.users_detail),
include-->从项目根路由文件中跳转到应用的路由,例如:
path('users/',include("users.urls")), #使用include模块来使用users应用的路由
register_converter-->自定义路径转换器,例如:
class FourDigitYearConverter:
regex = '[0-9]{4}'
def to_python(self, value):
return int(value)
def to_url(self, value):
return f"{value:4d}" #格式化 宽度为4
register_converter(FourDigitYearConverter,'yyyy')
from extra_apps import xadmin
后台管理xadmin的导入,例如:
path('xadmin/', xadmin.site.urls),
在settings.py中
sys.path.insert(0, os.path.join(BASE_DIR, 'extra_apps'))
注册项目app
'xadmin.apps.XAdminConfig',
项目根目录下
from django.views.generic import TemplateView
不通过views直接调转到网页,例如:
path('serverjQuery/',TemplateView.as_view(template_name="api/jQuery.html"),name="jQuer"),
path('server-axios/',TemplateView.as_view(template_name="api/vue-axios.html"),name="VueAxiox"),
放在views.py文件中
from django.shortcuts import render,redirect,HttpResponse
render-->函数返回跳转到网页,例如:
def users_detail(request, uid):
return render(request,"users_dtail.html",context={"userinfo": uid})
redirect-->函数反转命名的路由
return redirect( reverse("users:usersLogin"))
HttpResponse-->函数返回字符串数据
return HttpResponse("get方法")
return HttpResponse(data)
from django.http import JsonResponse
返回json数据,例如:
class ApiView(View):
def get(self, request):
users = Server.objects.values()
return JsonResponse(list(users), safe=False)
from django.views.decorators.csrf import csrf_exempt
from django.utils.decorators import method_decorator
method_decorator-->用于对类的方法进行装饰,它可以将函数装饰器,转换为类装饰器,例如:
@method_decorator(csrf_exempt, name='dispatch')
预防CSRF(跨站请求伪造,是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。)
另外,可以在form表单中添加 {% csrf_token %}
from django.views import View
在CBV(基于类的视图)中,类继承,例如:
class ApiView(View):
def get(self, request):
return HttpResponse("get方法")
def post(self, request):
return HttpResponse("post方法")
可以在urls.py中这样调用
path('user-json1/',views.ApiView.as_view(),name="user1json"),
as_view() 返回了 view 闭包函数
--> view 返回了 dispatch 方法的返回值
--> dispatch 利用反射 getattr 获取你自己视图中定义的方法
这个方法需要是 HTTP协议中支持的方法的小写
--> handler get或者post 等
from django.views.generic import ListView,DetailView
from django.utils import timezone 时间
CBV方法
class ServerListView(ListView):
# 指定获取数据的 model
# queryset = Server.objects.order_by("-id")
model = Server
# 指定模板语言中使用的变量名
context_object_name = "serverList"
# 指明模板名称, 默认是 `model所在的应用名/model 名称的小写_list.html
template_name = "cbv/server-list.html"
动态过滤
class ArticlePostListView(ListView):
context_object_name = 'serverList'
template_name = 'cbv/server-list.html'
def get_queryset(self):
# server_id=self.kwargs['sid']
server_id=self.request.GET.get('sid')
return Server.objects.filter(id__gt = server_id)
# return Server.objects.order_by("-id")
# 获取 GET 请求的参数
指定时间
class ServerNowListView(ListView):
model = Server
context_object_name = "serverList"
template_name = "cbv/server-list.html"
# 指明模板名称, 默认是 `model所在的应用名/model 名称的小写_list.html
def get_context_data(self, kwargs):
context = super().get_context_data(kwargs)
# context = {"serverList":Server.objects.all()}
# 以下是新添加的内容
context['now'] = timezone.now()
return context
from django.contrib.auth.mixins import LoginRequiredMixin 限制未登录用户的访问,放在继承的最左边
from django.urls import reverse_lazy
class ServerDetailView(LoginRequiredMixin,DetailView):
login_url=reverse_lazy("users:usersLogin")
model = Server
context_object_name = "server"
template_name = "cbv/server-detail.html"
form表单创建!
在users_forms.py中
from django import forms
表单类
class UserRegisterModelForm(forms.ModelForm):
class Meta:
model = UsersProfile
fields=[
"username","password",
"mobile","age","gender"]
widgets = {
#字段名称: 小插件
'gender': forms.RadioSelect()
}
def clean_mobile(self):
"""
验证手机号是否合法
:return: 合法的数据或者错误信息
"""
mobile = self.cleaned_data['mobile']
PRGEX_MOBILE = r'1[358]\d{9}|147\d{8}|^176\d{8}$'
regex = re.compile(PRGEX_MOBILE)
if regex.match(mobile):
return mobile
else:
raise forms.ValidationError(
'无效手机号',
code='mobile_invalid'
)
在对应的views.py中
from django.contrib.auth.views import LoginView,LogoutView
from django.urls import reverse_lazy
登录和退出的类的视图
class UsersLoginView(LoginView):
# 指定一个用于接收到 GET 请求时,需要返回的模板文件
template_name = "users/login.html"
class UsersLogoutView(LogoutView):
# 用户退出登录后,将要跳转的 URL
next_page = reverse_lazy('index')
在settings.py中
# 设置用户登录相关信息
from django.urls import reverse_lazy
# 用户登录成功后跳转的 URL
LOGIN_REDIRECT_URL = reverse_lazy("index")
# 用户登录 GET 请求的 URL和登录验证失败后跳转到的 URL
LOGIN_URL = reverse_lazy('users:usersLogin')
from django.views.generic.edit import FormView
存库,例如:
class UserRegisterFormView(FormView):
template_name = 'users/register.html'
form_class = UserRegisterModelForm
success_url = reverse_lazy('users:usersLogin')
def form_valid(self,form):
user = UsersProfile(**form.cleaned_data)
user.set_password(form.cleaned_data['password'])
user.save()
return super().form_valid(form)
def form_invalid(self,form):
print("form-->", form)
return super().form_invalid(form)
返回json数据有两种方式
1.model_name.objects.values()
2.serializers.serialize()
urls.py中
path('user-json1/',views.ApiView.as_view(),name="user1json"),
path('user-json2/',views.SerialazerView.as_view(),name="user2json"),
views.py中
from django.views import View
from django.http import JsonResponse,HttpResponse
class ApiView(View):
def get(self, request):
users = Server.objects.values()
return JsonResponse(list(users), safe=False)
from django.core import serializers
class SerialazerView(View):
def get(self,request):
users = UsersProfile.objects.all()
data = serializers.serialize('json',users)
return HttpResponse(data)
users_auth.py 自定义验证类
① 编写自定义验证类
可以在项目 app 的任意一个文件中编写这个类,之后设置一下就可以了。
比如在 users 应用下新建一个文件 users_auth.py, 添加如下内容
from django.contrib.auth.backends import ModelBackend
from django.contrib.auth import get_user_model
from django.db.models import Q
User = get_user_model()
class CustomBackend(ModelBackend):
def authenticate(self, request, username=None, password=None, **kwargs):
try:
# 通过用户名或邮箱来获取用户对象
user = User.objects.get(
Q(username=username) |
Q(email=username ) |
Q(mobile = username)
)
# 验证用户的密码
if user.check_password(password):
return user
except Exception:
return None
② 在 settings.py 中设置
# 自定义登录验证类
AUTHENTICATION_BACKENDS = (
'users.users_auth.CustomBackend', # 注意后面的逗号
)
单文件测试
zxhsite/tests.py中
from django.test import TestCase
测试文件必备模块
import os, sys
# 获取到项目的根目录
PROJECT_ROOT = os.path.dirname(os.path.abspath(file))
# 把项目的根目录放到 sys.path 中
sys.path.insert(0, PROJECT_ROOT)
# 设置环境变量
os.environ["DJANGO_SETTINGS_MODULE"] = 'zxhsite.settings'
import django
django.setup()
if name == "main":
"""在这里写自己的测试代码"""
# 导入 映射类
from users.models import UsersProfile
# 获取表中的第一条数据
user = UsersProfile.objects.all().first()
print(user.username, user.email)
在models.py文件中
from django.contrib.auth.models import AbstractUser
继承django自身的用户表(自定义用户表),例如:
class UsersProfile(AbstractUser):
gender_choice=(('1',"男"),('2',"女"))
mobile = models.CharField('手机', max_length=11)
gender = models.CharField('性别', choices=gender_choice, default="1", max_length=1)
avatar = models.ImageField(verbose_name="头像", upload_to='users/%Y/%m/%d/',
max_length=128, null=True, blank=True)
age = models.IntegerField('年龄',default=18)
在settings.py中
#上传文件图片的根路径
MEDIA_ROOT = os.path.join(BASE_DIR, "media")
#访问文件的URL
MEDIA_URL = '/media/'
# 自定义用户表,在 settings.py 中添加如下配置信息
AUTH_USER_MODEL = 'users.UsersProfile'
插件
<link rel="stylesheet"href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" >
<script src="https://cdn.jsdelivr.net/npm/jquery@1.12.4/dist/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/js/bootstrap.min.js"></script>
自定义插件
在settings.py中
STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'statics'),]
<link rel="stylesheet" href="/static/bootstrap/css/bootstrap.min.css" >
jQuery (Bootstrap 的所有 JavaScript 插件都依赖 jQuery,所以必须放在前边)
<script src="https://cdn.jsdelivr.net/npm/jquery@1.12.4/dist/jquery.min.js"></script>
<script src="{% static 'bootstrap/js/bootstrap.min.js' %}"></script>
<script src="{% static 'js/vue.min.js' %}"></script>
<script src="{% static 'js/axios.min.js' %}"></script>