創(chuàng)建超級用戶
python3 manage.py createsuperuser username
修改密碼
python3 manage.py changepassword username
安裝django2.1環(huán)境并運行
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直接調轉到網(wǎng)頁,例如:
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-->函數(shù)返回跳轉到網(wǎng)頁,例如:
def users_detail(request, uid):
return render(request,"users_dtail.html",context={"userinfo": uid})
redirect-->函數(shù)反轉命名的路由
return redirect( reverse("users:usersLogin"))
HttpResponse-->函數(shù)返回字符串數(shù)據(jù)
return HttpResponse("get方法")
return HttpResponse(data)
from django.http import JsonResponse
返回json數(shù)據(jù)星虹,例如:
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-->用于對類的方法進行裝飾,它可以將函數(shù)裝飾器,轉換為類裝飾器,例如:
@method_decorator(csrf_exempt, name='dispatch')
預防CSRF(跨站請求偽造,是一種挾制用戶在當前已登錄的Web應用程序上執(zhí)行非本意的操作的攻擊方法。)
另外劲适,可以在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 閉包函數(shù)
--> view 返回了 dispatch 方法的返回值
--> dispatch 利用反射 getattr 獲取你自己視圖中定義的方法
這個方法需要是 HTTP協(xié)議中支持的方法的小寫
--> handler get或者post 等
from django.views.generic import ListView,DetailView
from django.utils import timezone 時間
CBV方法
class ServerListView(ListView):
# 指定獲取數(shù)據(jù)的 model
# queryset = Server.objects.order_by("-id")
model = Server
# 指定模板語言中使用的變量名
context_object_name = "serverList"
# 指明模板名稱, 默認是 `model所在的應用名/model 名稱的小寫_list.html
template_name = "cbv/server-list.html"
動態(tài)過濾
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 請求的參數(shù)
指定時間
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表單創(chuàng)建壶辜!
在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: 合法的數(shù)據(jù)或者錯誤信息
"""
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數(shù)據(jù)有兩種方式
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)
# 設置環(huán)境變量
os.environ["DJANGO_SETTINGS_MODULE"] = 'zxhsite.settings'
import django
django.setup()
if name == "main":
"""在這里寫自己的測試代碼"""
# 導入 映射類
from users.models import UsersProfile
# 獲取表中的第一條數(shù)據(jù)
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>