Django精品散裝知識點

創(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>

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末瘟判,一起剝皮案震驚了整個濱河市幔睬,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌赫模,老刑警劉巖悬赏,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件隘梨,死亡現(xiàn)場離奇詭異,居然都是意外死亡舷嗡,警方通過查閱死者的電腦和手機轴猎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來进萄,“玉大人捻脖,你說我怎么就攤上這事≈惺螅” “怎么了可婶?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長援雇。 經(jīng)常有香客問我矛渴,道長,這世上最難降的妖魔是什么惫搏? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任具温,我火速辦了婚禮,結果婚禮上筐赔,老公的妹妹穿的比我還像新娘铣猩。我一直安慰自己,他們只是感情好茴丰,可當我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布达皿。 她就那樣靜靜地躺著,像睡著了一般贿肩。 火紅的嫁衣襯著肌膚如雪峦椰。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天汰规,我揣著相機與錄音汤功,去河邊找鬼。 笑死控轿,一個胖子當著我的面吹牛冤竹,可吹牛的內容都是我干的拂封。 我是一名探鬼主播,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼鹦蠕,長吁一口氣:“原來是場噩夢啊……” “哼冒签!你這毒婦竟也來了?” 一聲冷哼從身側響起钟病,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤萧恕,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后肠阱,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體票唆,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年屹徘,在試婚紗的時候發(fā)現(xiàn)自己被綠了走趋。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡噪伊,死狀恐怖簿煌,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情鉴吹,我是刑警寧澤姨伟,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站豆励,受9級特大地震影響夺荒,放射性物質發(fā)生泄漏。R本人自食惡果不足惜良蒸,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一技扼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧诚啃,春花似錦淮摔、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽仔燕。三九已至造垛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間晰搀,已是汗流浹背五辽。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留外恕,地道東北人杆逗。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓乡翅,卻偏偏與公主長得像,于是被迫代替她去往敵國和親罪郊。 傳聞我的和親對象是個殘疾皇子蠕蚜,可洞房花燭夜當晚...
    茶點故事閱讀 43,697評論 2 351

推薦閱讀更多精彩內容