Django筆記(二)
1.當啟動專案的時候,有多個檔案,其中只有一個是Django,要讓pycharm識別,可以進行設定
第一步:File--setting
第二步:
這樣pycharm就能識別這個檔案是Django
2.在寫一個新的功能的時候,先在views裡面寫邏輯語句,然後到urls裡面配置url,最後在html中修改獲取的引數,還有會用到(例如點選某個分類展示所有的文章)
def category(request,id):
category_obj=models.Category.objects.filter(id=id).first()#是一個物件的陣列,要取第一個資料,然後取其中的某個資料要用.name等
articles=models.Article.objects.filter(category_id=id)
return render(request,'category.html',{'articles':articles,'category_obj':category_obj})
當views裡的函式有引數的時候,urls裡面也要帶上引數
path('category/<int:id>', views.category),#用尖括號代表url後面跟的是什麼樣的引數
3.前端程式碼的重複利用和後端程式碼的重複利用
前端程式碼複用程式碼:採取的方式是:先建立以個base頁面將所有的共用的body、css、js放在頁面上,在要擴充套件或個個頁面不一樣的地方,留一個介面,方便其他的頁面複用
<link href="https://cdn.bootcss.com/twitter-bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet"> <link href="https://cdn.bootcss.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet"> <script src="/static/js/headroom.min.js"></script> <!-- blog CSS --> <link href="/static/css/base.css" rel="stylesheet"> {% block css %}#可以咋具體的頁面增加頁面獨有的css樣式 {% endblock %}
<div class="row">
{% block content %}#在body裡新增具體的頁面內容,可以有多個,但是名字不能重複
{% endblock %}
<script>
$(function () {
var myElement = document.querySelector(".blog-navbar");
var headroom = new Headroom(myElement);
headroom.init()
});
</script>
<script src="/static/js/base.js?v=20191123.0909890"></script>
{% block js %}#具體的頁面增加特有的js
{% endblock %}
後端程式碼的重複利用:新增一個叫上下文字器,使用上下文字器的時候需要匯入(寫幾個方法就需要寫幾個匯入)不能忘記。
EMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR,'templates')],#尋找到放HTML的地址
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
'user.content_process.content_process',
'user.content_process.process_title',#上下文管理器要配置
],
},
},
]
from . import models
def content_process(request):#把後端都用到的程式碼放在上下文字器中
categories = models.Category.objects.all()
return {'categories':categories}
def process_title(request):
web_site=models.WebSite.objects.all().first()
return {'web_site':web_site}
使用上下文管理器,程式碼的執行過程,首先執行views裡面的程式碼,然後templates裡面時候有上下文管理器,有的話再執行裡面的程式碼,返回給views,再執行urls,最後修改前端的程式碼
4.前端把資料寫到後臺有兩種方式:同步form形式和非同步ajax形式
5.request裡有哪些方法
print(request.method) #請求方式
print(request.GET)# url?key=vlauye
print(request.POST)#url key-vlaue
print(request.COOKIES)
print(request.path_info) #請求的路徑 /post /cate
print(request.FILES) #獲取檔案
print(request.META) #請求頭相關的都在這裡
print(request.body) #body裡面的內容
應用:獲取前端頁面的內容,寫進資料庫
def article(request):
if request.method=='GET':
return render(request,'post.html')
else:
title = request.POST.get('title')
content = request.POST.get('content')
category = request.POST.get('category')
models.Article.objects.create(title=title,content=content,category_id=category)
return HttpResponseRedirect('/')
6.使用Django自帶的後臺管理,快速的插入資料
進入django自帶的後臺管理:
首先進入django專案裡
建立賬號和密碼
然後登入到後臺http://127.0.0.1:8000/admin/,輸入剛剛註冊使用者名稱和密碼登入
在models裡面新建一張表結構,然後到admin.py中register
class user_info(models.Model):
name=models.CharField(verbose_name='使用者名稱',max_length=15,unique=True)
nick=models.CharField(verbose_name='暱稱',max_length=20)
passwd=models.CharField(verbose_name='密碼',max_length=10)
createTime=models.DateTimeField(verbose_name='建立時間',auto_now_add=True)
updateTime=models.DateTimeField(verbose_name='更新時間',auto_now=True)
class Meta:
db_table = 'info'
verbose_name = '使用者資訊'#在站點管理裡展示表的名字
verbose_name_plural = verbose_name#通常是複數展示,不寫這個直接在verbose_name後面加上s
def __str__(self):#寫上這個函式,在增加或獲取的時候返回的不是一個物件而是直觀的資料
return self.name
admin.site.register(models.user_info)
這樣可以快速的視覺化增加刪除資料,點選增加就可以增加資料和刪除資料
為了更加直觀的展示django裡面的資料
class ArticleAdmin(admin.ModelAdmin):
list_per_page = 10 #每頁最多展示多少條資料
list_display = ['id','title','content','create_time'] #展示哪些欄位
list_filter = ['category'] #按照哪些欄位來篩選
search_fields = ['title','content']
admin.site.register(models.Article,ArticleAdmin)
7.中介軟體
中介軟體的原理:中間可以做一下快速的處理,和代理類似
沒有中介軟體:請求---views---template--urls--html
有中介軟體:請求--中介軟體---views---template--urls--html
from django.http import HttpResponse
from django.middleware.common import MiddlewareMixin
from . import models
class TestMiddleWare(MiddlewareMixin):
def process_request(self,request):
'''請求過來之後先走到的這裡'''
print('request....')
path = request.path_info
interface = models.Interface.objects.filter(path=path).first()
if interface:
return HttpResponse(interface.response)
def process_response(self,request,response):
#攔截返回的
print('response....')
return response
def process_exception(self,request,exception):
#攔截異常的
print('出異常了。。')
return HttpResponse('hhhh')
8.在一對多的關係
A表(文章表)對B表(類別表)是1對多的關係,一個類別一共有多少篇文章,可以只用一張表就可以查出資料
c_obj=models.Category.objects.get(name='C++') print(c_obj.article_set.count())
c_obj.article_set後面可以點出其他的功能