1. 程式人生 > 實用技巧 >Django筆記(二)

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後面可以點出其他的功能