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>

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,509评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,806评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,875评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,441评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,488评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,365评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,190评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,062评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,500评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,706评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,834评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,559评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,167评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,779评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,912评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,958评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,779评论 2 354

推荐阅读更多精彩内容