Django筆記

Django筆記

一次只打開一次服務css

Django中不能執行函數html

web服務器:負責處理http請求響應靜態文件,常見的有 Apache , Nginx前端

M :表明模型(Model),即數據存取層。 該層處理與數據相關的全部事務: 如何存取、如何驗證有效node

T :表明模板(Template),即表現層。 該層處理與表現相關的決定: 如何在頁面或其餘類型文檔中進行顯示。python

V :表明視圖(View),即業務邏輯層該層包含存取模型及調取恰當模板的相關邏輯。 你能夠把它看做模型與模板之間的橋樑。mysql

 

Django請求的生命週期

經過URL對應關係匹配 ->找到對應的函數(或者類)->返回字符串(或者讀取Html以後返回渲染的字符串)git

啓動

進入到虛擬環境 workon django-env github

想要在其餘電腦上也能訪問本網站,那麼須要指定 ip 地址爲 0.0.0.0web

建立應用(app):一個項目相似因而一個架子,可是真正起做用的仍是 app 。正則表達式

python manage.py startapp [app名稱]

使用 pycharm 建立完項目後,仍是須要從新進入到命令行單首創建 app 的。

視圖

視圖通常都寫在 app 的 views.py 中。而且視圖的第一個參數永遠都是 request (一個

HttpRequest)對象。

from django.http import HttpResponse
def book_list(request):
return HttpResponse("書籍列表!")
path('book/',views.book)   #book後面無()執行這個函數 有就是函數執行的結果放進去
text = "您輸入的書籍的id是:%s" % book_id  #注意是%s否則傳不進去
book_id = request.GET.get("id")
book_id = request.GET['id'] #不建議使用,多是錯的

 

 

reverse反轉

 

 

 

應用命名空間

在view上反轉:從urls上引進來的

urls.py
app_name='front' #加了命名空間views.py上沒有就報錯:NoReverseMatch at /
urlpatterns = [
path('login/',views.login,name='login'), #在url中取名字
]
views.py
from django.shortcuts import redirect,reverse
      login_url=reverse('front:login')
      return redirect(login_url)

 

INSTALLED_APPS=[]   #已經安裝的app 33

'APP_DIRS': True, #在其餘的app中尋找

 

<li><a href="{% url 'book' %}">讀書</a></li>
<li><a href="{% url 'detail' book_id='1' category=1 %}">最火的一篇文章</a></li>
<li>   <a href="{% url 'login' %}?next=/">    登陸</a></li>

 

 

過濾器

cut

{{ 'valude   dsa'|cut:" " }}		#刪除空格

 

date

# 數據 
context = { 
"birthday": datetime.now() 
} 
\# 模版 
{{ birthday|date:"Y/m/d" }}

 

 

 

加載靜態文件

1掛鉤

static中新建一個文件夾與父文件夾名字保持一致

2不想重複加載就能夠使用static

{% load static %} 
<link rel="stylesheet" href="{% static 'style.css' %}">

 

TEMPLATES/OPTIONS 		#添加	52
'builtins': ['django.templatetags.static'] 			#之後在模版中就能夠直接使用 static 標籤

!!!前端的什麼樣式一股腦放在當前項目的static文件下面而後link

 STATICFILES_DIRS = [ 			#在setting最後一行添加
 os.path.join(BASE_DIR,"static") 
 ]

 

數據庫

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'django',
        'USER':'root',
        'PASSWORD':'1234',
        'HOST':'127.0.0.1',
        'POST':'3306',
    }
}

 

 

pymysql鏈接數據庫

import pymysql
db = pymysql.connect("localhost", "root", "1234", "django")
cursor = db.cursor()							# 使用 cursor() 方法建立一個遊標對象 cursor

cursor.execute("SELECT * from user")			# 使用 execute()  方法執行 SQL 查詢

data = cursor.fetchall()						# 使用 fetchone() 方法獲取單條數據.

db.close()										# 關閉數據庫鏈接
cursor.execute("insert into book(id,name,author) values(null,'%s','%s')" % (name,author))

插入獲取的數據:

name = request.POST.get("name")
author = request.POST.get("author")
cursor.execute("insert into book(id,name,author) values(null,'%s','%s')" % (name,author))

鏈接數據庫: 垃圾mysqlclient __init__

import pymysql
pymysql.install_as_MySQLdb()
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'

sqlite的導出

python manage.py dumpdata > data.json

MySQL導入數據

python manage.py loaddata data.json

ORM

一個表一個模型 表當中有多少個字段在模型中就有多少個屬性

 

 

返回想要打印的字段

models.py

def __str__(self):
    # <Book:(name,author,price)>
    return "<Book:({name},{author},{price})>".format(name=self.name,author=self.author,price=self.price)

format格式化函數:

"{1} {0} {1}".format("hello", "world")  # 設置指定位置				#'world hello world'

查找

views.py中

根據id的方式進行查找

from .models import Book
book = Book.objects.get(pk=1)				#pk主鍵		#book = Book.objects.first()
print(book)

根據其餘條件進行查找

books = Book.objects.filter(name='三國演義').first() #filter過濾器	frist第一個值  返回Book類型

查詢方式

.query 查詢最終被翻譯成的sql語句 再filter中使用,返回的是一個數據集

query 只能被用在QuerySet對象上

exact

article = Article.objects.get(id__exact=14)			#__exact寫不寫都同樣	大小寫不敏感

iexact: 使用 like 進行查找。

contains: 大小寫敏感,判斷某個字段是否包含了某個數據。 加了binary 有%

icontains: 大小寫不敏感的匹配查詢。

 

F表達式:優化 ORM 操做數據庫的

Employee.object.update(salary=F("salary")+1000)			#相等	直接操做
authors = Author.objects.filter(name=F("email"))		#不等,判斷是否相等

Q表達式:要查詢全部價格低於10元,或者是評分低於9分的圖書。

from django.db.models import Q
books = Book.objects.filter(Q(price__lte=10) | Q(rating__lte=9))

聚合函數:

from django.db.models import Avg,Count,Max,Min,Sum,F,Q
result = Book.objects.aggregate(avg=Avg('price'))
# print(connection.queries)				打印語句

獲取圖書和做者的名字

books = Book.objects.annotate(author_name=F("author__name"))#不是annotate頂多獲取做者id
for book in books:
    print('%s/%s' % (book.name,book.author_name))			#比author.name效率高

鏈式調用

filter :將知足條件的數據提取出來 exclude :排除知足條件的數據

books = Book.objects.filter(id__gte=2).exclude(id=3)			#.filter(~Q(id=3))

 

添加,刪除,修改

a= request.POST['name']

book = Book(name='西遊記',author='吳承恩',price=100)
book.save()
book = Book.objects.get(pk=1)			#先獲取
book.delete()
book = Book.objects.get(pk=2)
book.price = 200
book.save()

 

 

 

模型經常使用屬性:

CharField:必須 要指定最大的長度

title = models.CharField(max_length=200)

TextField: 大量的文本類型。映射到數據庫中是longtext類型。

BooleanField: 在模型層面接收的是 True/False 。在數據庫層面是 tinyint 類型。

removed = models.NullBooleanField()			#可爲空

FloatField: 浮點類型。映射到數據庫中是 float 類型。

UUIDField: 只能存儲 uuid 格式的字符串。 uuid 是一個32位的全球惟一的字符串,通常用來做爲主鍵。

外鍵

父類影響子類

category =models.ForeignKey		cascade

("Category",on_delete=models.CASCADE,null=True,related_name='articles')
 author = models.ForeignKey("frontuser.FrontUser",on_delete=models.CASCADE,null=True)

class Comment(models.Model):
    content = models.TextField()
    origin_comment = models.ForeignKey("Comment",on_delete=models.CASCADE)
    "Comment"	"article.Comment"	"self"			#引用自身的三種方式
user = User.objects.first() 			# 獲取第一個用戶寫的全部文章 		23
articles = user.article_set.all()		#子類名小寫加_set
或者再models.py中建立數據庫時#related_name='articles'		==		articles_set

 

 

死循環:

解決,而且自動保存了 使用bulk參數

 

 

 

 

 

 

pycharm小工具

直接輸入,不須要python manage.py makemigrations

startapp name 建立新項目

makemigrations 遷移腳本的生成

migrate 將遷移腳本文件映射到數據庫中

 

 

更改表名(建立表的過程當中)models.py

 

鏈接數據庫url後加: ?serverTimezone=UTC

ctrl+w 選中一個,在按再選中一個

 

 

 

 

表單

froms.py中

from django import forms

class MesssageBoardForm(forms.Form):
    title = forms.CharField(max_length=100,min_length=2,label='標題',error_messages={"min_length":"最少不能少於1個字符!"})
    content = forms.CharField(widget=forms.Textarea,label='內容',error_messages={"required":"必需要傳content字段!"})
    email = forms.EmailField(label='郵箱',error_messages={"required":'必需要傳email字段!'})
    reply = forms.BooleanField(required=False,label='是否回覆')

views.py中

from django.shortcuts import render
from django.views.generic import View
from .forms import MesssageBoardForm
from django.http import HttpResponse
from django.forms.utils import ErrorDict			#無用,查看get_json_data()的

class IndexView(View):
    def get(self,request):
        form = MesssageBoardForm()			#空表單
        return render(request,'index.html',context={"form":form})
    
    #打印返回的數據
    def post(self,request):
        form = MesssageBoardForm(request.POST)
        if form.is_valid():
            title = form.cleaned_data.get('title')
            content = form.cleaned_data.get('content')
            email = form.cleaned_data.get('email')
            reply = form.cleaned_data.get('reply')
            print('='*30)
            print(title)
            print(content)
            print(email)
            print(reply)
            print('='*30)
            return HttpResponse('success')
        else:
            print(form.errors.get_json_data())
            return HttpResponse('fail')

urls.py中

from django.urls import path
from front import views
urlpatterns = [
    path('', views.IndexView.as_view()),
]

html中

<form action="" method="post">			#form中action留空	指定當前頁面的url
    <table>
        {{ form.as_table }}				#自動生成
        <tr>
            <td></td>
            <td><input type="submit" value="提交"></td>
        </tr>
    </table>
</form>

驗證器:

class MyForm(forms.Form): 
		telephone = forms.CharField(validators=[validators.RegexValidator("1[345678]\d 
{9}",message='請輸入正確格式的手機號碼!')]) 

 

 

項目

 

 

項目代碼

概念

  • nvm(version):管理node.js的工具

  • node.js自帶有npm包管理工具

  • npm(package):相似python的pip

  • gulp:壓縮

操做

下載nvm

https://github.com/coreybutler/nvm-windows/releases nvm-setup.zip

nvm經常使用命令

  • nvm install node 最新

  • nvm install version 指定

  • nvm use version 使用

  • nvm list 列出

  • nvm uninstall version 卸載

生成packag.json文件

  • npm init

安裝gulp

  • npm install gulp -g 全局

  • npm install gulp --save-dev 本地

建立gulp任務:gulpfile.js

var gulp = require("gulp")

gulp.task("greet",function(){
		console.log('hello world');
});

建立處理css文件的任務:

npm install gulp-cssnano --save-dev
var gulp = require("gulp")
var cssnano = require("gulp-cassnano")

gulp.task("css",function(){
	gulp.src('./css/*.css')
	.pipe(cassnano())
	.pipe(gulp.dest("./css/dist"))
})

 

Blog

admin.py

from django.contrib import admin
from .models import Banner, Category, Tag, Tui, Article, Link
#導入須要管理的數據庫表

@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
    list_display = ('id', 'category', 'title', 'tui', 'user', 'views', 'created_time')
    # 文章列表裏顯示想要顯示的字段
    list_per_page = 50
    # 滿50條數據就自動分頁
    ordering = ('-created_time',)
    #後臺數據列表排序方式
    list_display_links = ('id', 'title')
    # 設置哪些字段能夠點擊進入編輯界面



@admin.register(Banner)
class BannerAdmin(admin.ModelAdmin):
    list_display = ('id', 'text_info', 'img', 'link_url', 'is_active')

@admin.register(Category)
class CategoryAdmin(admin.ModelAdmin):
    list_display = ('id', 'name', 'index')

@admin.register(Tag)
class TagAdmin(admin.ModelAdmin):
    list_display = ('id', 'name')

@admin.register(Tui)
class TuiAdmin(admin.ModelAdmin):
    list_display = ('id', 'name')

@admin.register(Link)
class LinkAdmin(admin.ModelAdmin):
    list_display = ('id', 'name','linkurl')

models.py

from django.db import models
from django.contrib.auth.models import User


# 導入Django自帶用戶模塊

# 文章分類
class Category(models.Model):
    name = models.CharField('博客分類', max_length=100)
    index = models.IntegerField(default=999, verbose_name='分類排序')

    class Meta:
        verbose_name = '博客分類'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.name


# 文章標籤
class Tag(models.Model):
    name = models.CharField('文章標籤', max_length=100)

    class Meta:
        verbose_name = '文章標籤'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.name


# 推薦位
class Tui(models.Model):
    name = models.CharField('推薦位', max_length=100)

    class Meta:
        verbose_name = '推薦位'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.name


# 文章
class Article(models.Model):
    title = models.CharField('標題', max_length=70)
    excerpt = models.TextField('摘要', max_length=200, blank=True)
    category = models.ForeignKey(Category, on_delete=models.DO_NOTHING, verbose_name='分類', blank=True, null=True)
    # 使用外鍵關聯分類表與分類是一對多關係
    tags = models.ManyToManyField(Tag, verbose_name='標籤', blank=True)
    # 使用外鍵關聯標籤表與標籤是多對多關係
    img = models.ImageField(upload_to='article_img/%Y/%m/%d/', verbose_name='文章圖片', blank=True, null=True)
    body = models.TextField()


    user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='做者')
# """
# 文章做者,這裏User是從django.contrib.auth.models導入的。
# 這裏咱們經過 ForeignKey 把文章和 User 關聯了起來。
# """
    views = models.PositiveIntegerField('閱讀量', default=0)
    tui = models.ForeignKey(Tui, on_delete=models.DO_NOTHING, verbose_name='推薦位', blank=True, null=True)

    created_time = models.DateTimeField('發佈時間', auto_now_add=True)
    modified_time = models.DateTimeField('修改時間', auto_now=True)


    class Meta:
        verbose_name = '文章'
        verbose_name_plural = '文章'


    def __str__(self):
        return self.title


# Banner
class Banner(models.Model):
    text_info = models.CharField('標題', max_length=50, default='')
    img = models.ImageField('輪播圖', upload_to='banner/')
    link_url = models.URLField('圖片連接', max_length=100)
    is_active = models.BooleanField('是不是active', default=False)

    def __str__(self):
        return self.text_info

    class Meta:
        verbose_name = '輪播圖'
        verbose_name_plural = '輪播圖'


# 友情連接
class Link(models.Model):
    name = models.CharField('連接名稱', max_length=20)
    linkurl = models.URLField('網址', max_length=100)

    def __str__(self):
        return self.name

    class Meta:
        verbose_name = '友情連接'
        verbose_name_plural = '友情連接'

 

 

 

 

再次筆記

path(正則表達式, views視圖函數,參數,別名),

前2個必需要寫

 

每一個url都帶一個最前面的/ 因此不須要寫

#(寫也能夠,如path('/admin/', admin.site.urls) 對應網址http://127.0.0.1:8000//admin/

說不定可起到保護做用哦!

 

在Python正則表達式中,命名正則表達式組的語法

(?P<name>pattern),其中name是組的名稱

相關文章
相關標籤/搜索