一次只打開一次服務css
html
web服務器:負責處理http請求,響應靜態文件,常見的有 Apache , Nginx前端
M :表明模型(Model),即數據存取層。 該層處理與數據相關的全部事務: 如何存取、如何驗證有效node
T :表明模板(Template),即表現層。 該層處理與表現相關的決定: 如何在頁面或其餘類型文檔中進行顯示。python
V :表明視圖(View),即業務邏輯層該層包含存取模型及調取恰當模板的相關邏輯。 你能夠把它看做模型與模板之間的橋樑。mysql
經過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>
{{ 'valude dsa'|cut:" " }} #刪除空格
# 數據 context = { "birthday": datetime.now() } \# 模版 {{ birthday|date:"Y/m/d" }}
static中新建一個文件夾與父文件夾名字保持一致
{% load static %} <link rel="stylesheet" href="{% static 'style.css' %}">
TEMPLATES/OPTIONS #添加 52 'builtins': ['django.templatetags.static'] #之後在模版中就能夠直接使用 static 標籤
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', } }
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
一個表一個模型 表當中有多少個字段在模型中就有多少個屬性
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中
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參數
直接輸入,不須要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:壓縮
https://github.com/coreybutler/nvm-windows/releases nvm-setup.zip
nvm install node 最新
nvm install version 指定
nvm use version 使用
nvm list 列出
nvm uninstall version 卸載
npm init
npm install gulp -g 全局
npm install gulp --save-dev 本地
var gulp = require("gulp") gulp.task("greet",function(){ console.log('hello world'); });
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")) })
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/
說不定可起到保護做用哦!
(?P<name>pattern),其中name是組的名稱