django入門篇

0.安裝django:2.1.8 3.0.8
pip3 freeze > requirements.txt 導出相關依賴
配置永久源
cd ~
mkdir .pip
cd .pip
cat pip.conf
[global]
timeout = 6000
index-url = http://pypi.douban.com/simple
trusted-host = pypi.douban.com
pip3.7 install -r requirements.txt --user
---------------------------------------------
deepin操作
mkdir -p /home/wyl/.pip/;
cat pip.conf
[global]
timeout = 6000
index-url = http://pypi.douban.com/simple
trusted-host = pypi.douban.com
/usr/local/python3/bin/pip3.7 install -r requirements.txt --user
--------------------------------------------
檢查:
/usr/local/python3/bin/python3.7 -m pip list
/usr/local/python3/bin/python3.7–m pip –-version查看當前Python對應的pip版本;
/usr/local/python3/bin/python3.7 –m pip list查看當前Python對應的pip安裝的第三方庫;
/usr/local/python3/bin/python3.7 –m pip install 庫名 即可安裝對應的擴展庫;
/usr/local/python3/bin/python3.7 –m pip uninstall 庫名 即可卸載對應的擴展庫;


#單獨安裝
/usr/local/python3/bin/pip3 install django==2.1.8 -i https://pypi.tuna.tsinghua.edu.cn/simple --user

windwos下安裝:
永久更改鏡像源
在  “C:\Users\用戶名”  文件夾下,添加pip文件夾,文件夾內新建pip.ini文件,內容爲:
[global]
https://pypi.tuna.tsinghua.edu.cn/simple
pip3 install -r requirements.txt
1.創建項目
cmd-進入目錄運行一下命令創建Django項目 
django-admin startproject Blog_wyl
2.修改set時區
LANGUAGE_CODE = 'zh-Hans'
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_L10N = True
USE_TZ = False
3.在項目目錄下創建模板和靜態資源存放的目錄
mkdir templates 
mkdir static
4.配置setting文件
在最後面加入:
STATIC_PATH = os.path.join(BASE_DIR,'static')
STATICFILES_DIRS = (STATIC_PATH,)
#添加用戶資源存文件夾
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
在第57行修改
TEMPLATES = [
{'DIRS':[os.path.join(BASE_DIR,'templates')]}
]
5.創建APP
python manage.py startapp Blog_app
6.setting.py添加app名稱如
在33行加入 
INSTALLED_APPS = ('Blog_app',)
7.配置mysql數據庫
#對於django2.2版本可能出現的問題解決方案:https://my.oschina.net/wangyunlong/blog/3075265
1.安裝pymysql模塊
pip isntall pymysql
2.在setting中註釋掉默認的數據庫.添加mysql配置
import pymysql
pymysql.install_as_MySQLdb()
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'Blog_app',
        'HOST': '47.104.124.214',
        'USER': 'root',
        'PASSWORD': 'django',
        'PORT': '3306',
    }
}
3.到mysql數據庫創建相關庫,切記編碼設置Blog_app爲utf-8
create database Blog_app
8.生產數據庫
切記手動創建數據庫且設置數據編碼爲utf8
python manage.py makemigrations #生產差異數據文件
python manage.py migrate #生產數據表
python manage.py createsuperuser #創建管理員root
9. 如果選用redis存儲session
1.安裝pip install django-redis
2.配置setting文件
vi setting.py
# 配置session使用redis
CACHES = {
    'default': {
        'BACKEND': 'django_redis.cache.RedisCache',
        'LOCATION': 'redis://47.104.124.214:6379', # 指明使用redis的1號數據庫後面加/庫名即可
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
             "PASSWORD": "",
        },
    },
}
# session的存儲配置
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
SESSION_CACHE_ALIAS = 'default'

# 設置session失效時間,單位爲秒
SESSION_COOKIE_AGE = 60*5
#redis簡單命令:redis-cli -h 47.104.124.214 -p 6379
#keys *
10.url 路由資料彙總
路由資料:https://www.cnblogs.com/zzzlw/p/9739789.html
導入include,re_path
from django.urls import path,include,re_path
導入app的視圖
from Registration import view
導入settings
from django.conf import settings
路由別名:
path('',views.index, name='index'),
多級路由:
path('Registration/',include('Registration.urls')),
動態路由:
path('articles/<int:id>', show_article) #類似訪問:articles/1 視圖頁面: show_article(request, id=id)
path('list-<int:lid>.html', views.list, name='list'),#列表頁 類似訪問: list-3.html
path('show-<int:sid>.html', views.show, name='show'),#內容頁
path('tag/<tag>', views.tag, name='tags'),#標籤列表頁類似訪問 :tag/zabbix
此時:模板頁面應都基於首頁路由進行配置如:
{% url 'index' %}show-{{ L.id }}.html
#如果有多個app時,該如何使用:
django-admin startproject django_test
django-admin startapp app1
django-admin startapp app2
第一種:每一個app都有單獨的urls.py
總:urls.py
##################################
from django.contrib import admin
from django.urls import include, path

urlpatterns = [
    path('admin/', admin.site.urls),
    path('app1/', include('app1.urls')),
    path('app2/', include('app2.urls')),
]
#############################
app1/urls.py與app2/urls.py
##############################
from django.urls import path
from . import views

urlpatterns = [
    path('index', views.index),
]
###############################
第二種:多個app用同一個urls.py
from django.contrib import admin
from django.urls import path
from app1 import views as app1_views #別名
from app2 import views as app2_views #別名

urlpatterns = [
    path('admin/', admin.site.urls),
    path('app1/', app1_views.index),
    path('app2/', app2_views.index),
]
###############最後views.py################
from django.shortcuts import render
from django.shortcuts import HttpResponse

def index(request):
    return HttpResponse('hello app1')
11:views資料彙總
1.如果有一個方法是全局公用的,比如所有頁面都還有相同的數據則可以將其方法直接加入setting文件如:views.py中有如下內容:global_variable 他爲一個全局函數。這種適合單個app全局變量,不過寫的方式很多。都可以實現。
def global_variable(request):
    allcategory = Category.objects.all()
    remen = Article.objects.filter(tui__id=2)[:6]
    tags = Tag.objects.all()
    return locals()
views操作數據庫:
#django的操作數據庫get方法是從數據庫的取得一個匹配的結果,返回一個對象,如果記錄不存在的話,它會報錯。
#django的操作數據庫filter方法是從數據庫的取得匹配的結果,返回一個對象列表,如果記錄不存在的話,它會返回[]。
#get 參數必須是model定義的字段,且查出來的記錄只有一條,多餘一條報錯
#fitler類似於模糊匹配,如mysql中的where ,like ,in 
all_remen_tui = models.Article.objects.filter(tui__id=2)[:6]
allbanner = models.Banner.objects.filter(is_active=True)[0:4]
cname = models.Category.objects.get(id=lid) #獲取當前文章的欄目名
#對數據進行倒序排列
allarticle = models.Article.objects.all().order_by('-id')[0:6] #order_by正對id自動進行倒序排序
hot = models.Article.objects.all().order_by('views')[:10] #針對views進行排序通過瀏覽數進行排序

此時可以在setting中將其註冊添加到TEMPLATES中
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR,'templates')],
        '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',
                'Blog_app.views.global_variable',
            ],
        },
    },
]


全局變量返回第二種寫法: 這種適合所有app共有的去全局變量
https://www.cnblogs.com/ccorz/p/django-zhong-desetting-quan-ju-bian-liang-de-dao-r.html
比如在setting文件中
配置:WHOSE = '誰的'
在views.py中導入settings配置如下:
from django.conf import settings
 def mainHandle(request):
     content={
    'WHOSE':settings.WHOSE    
     }
     return render(request, 'main.html',content)
然後在main.html中配置:
<a class="logo" href="#">
{{WHOSE}}工具
</a>
即可

return 返回內容建議使用:conent精確返回
def index(request):
    Persons = models.Person.objects.all()
    content = {
    'persons':Persons
    }
    return render(request,'index.html',content)

redirect 跳轉
def index(request):
    # 業務邏輯代碼
    return redirect("https://blog.csdn.net/miaoqinian")

HttpResponse 返回一個字符串

def index(request):
    # 業務邏輯代碼
    return HttpResponse("OK")

render返回一個字典
def index(request):
    content={
    'name':'wangyunlong-app2',
    'url':settings.web_url,
    }
    #return HttpResponse('hello app2')
    return render(request,'app2/index.html',content)
12:models 資料彙總
[12.1]:選擇性-[有具體範圍,具有不可變性]
1.如果某一個字段值具有多種選擇性,且選擇性具有確定不可變性質,比如:性別男/女兩種範圍固定不可能在多出個不男不女,比如狀態:上線/下線。
可用如下例1:
class User(models.Model):
    gender = (('male','男'),('female','女'))
    sex = models.CharField(verbose_name=u'性別',max_length=32,choices=gender,default="男")
例2:
class server(models.Model):
    server_status_choice=((0,'下線'),(1,'上線'),)
    name = models.CharField(max_length=100,verbose_name=u'主機名稱',default="")
    status = models.SmallIntegerField(choices=server_status_choice, default=0, verbose_name='設備狀態')

[12.2]選擇性-[無具體範圍,具有可變性]
利用數據庫關係模型如:通過一對多模型實現。

[12.3]一對一模型: 
#一對一模型: 一個人對應一個唯一的身份證號,不可重複。
例如:用戶確認碼,一個用戶對於一個確認碼
class User(models.Model):
    user = models.CharField(verbose_name=u'姓名',max_length=128,unique=True)
    gender = (('male','男'),('female','女'))
    sex = models.CharField(verbose_name=u'性別',max_length=32,choices=gender,default="男")
class ConfirmString(models.Model):
    code = models.CharField(max_length=256)
    user = models.OneToOneField('User',on_delete=models.CASCADE)
    c_time = models.DateTimeField(auto_now_add=True)

[12.4]一對多模型
一對多|多對一:一個服務器對應一個機房,一個機房可能對應多個服務器
資料:https://www.cnblogs.com/pyspark/p/8638180.html
idc = models.ForeignKey(idc,related_name='idc_server',on_delete=models.CASCADE,verbose_name=u'idc',default="")
#注:#on_delete=models.CASCADE主外關係鍵中,級聯刪除,也就是當刪除主表的數據時候從表中的數據也隨着一起刪除
註釋:related_name作用:
舉例:創建一個作者表和一個書籍表,一個作者可以寫多本書,一個書只能有一個作者。
class Person(models.Model);
    name = models.CharField(verbose_name='作者姓名', max_length=10)
class Book(models.Model):
    person = models.ForeignKey(Person, related_name='person_book')
    title = models.CharField(verbose_name='書籍名稱', max_length=10)
查詢這個人寫了多少本書:
person = Person.objects.fiter(name='wyl')
person.person_books.all()

[12.5]多對多模型:
一個服務器可以安裝多個應用,一個應用可以在多個服務器上安裝
class app(models.Model):
    name = models.CharField(max_length=100,verbose_name=u'應用名稱',default="")
    class Meta:
        db_table = 'app'
        verbose_name = "應用[app]"
        verbose_name_plural = "應用[app]"

    def __str__(self):
        return self.name    
class server(models.Model):
    name = models.CharField(max_length=100,verbose_name=u'主機名稱',default="")
    app_name = models.ManyToManyField(app,blank=True,verbose_name=u'應用名稱',)
例如博客中的標籤:
tags = models.ManyToManyField(Tag,verbose_name='標籤', blank=True)#多對多關係模型

[12.6] 總結字段
時間:    
     created_time = models.DateTimeField('發佈時間', auto_now_add=True)
     modified_time = models.DateTimeField('修改時間', auto_now=True)
     
url連接:
    link_url = models.URLField('圖片鏈接', max_length=100)
圖片:
    img = models.ImageField(upload_to='article_img/%Y/%m/%d/', verbose_name='文章圖片', blank=True, null=True)
    img = models.ImageField('輪播圖', upload_to='banner_img/')
    #數據庫中直接存圖片需要安裝:pip3 install Pillow 模塊
字符串
    user = models.CharField(verbose_name=u'姓名',max_length=128,unique=True)
    passwd = models.CharField(verbose_name=u'密碼',max_length=128)
郵箱:  
    email = models.EmailField(verbose_name=u'郵箱',unique=True)
布爾類型:
    confiremd = models.BooleanField(default=False)
文本:
    excerpt = models.TextField(verbose_name=u'摘要',max_length=200,blank=True)#文本類型
長整型:
    index = models.IntegerField(default=9999,verbose_name=u'分類排序')#整數形式
正整數:
    views = models.PositiveIntegerField('閱讀量', default=0)
IP地址:
    ip = models.GenericIPAddressField(verbose_name=u'ip地址',default="")
浮點數:
    
文件上傳: 
    # media/%Y%m%d/爲圖片的真實放置路徑,因爲settings中已經配置了MEDIA_ROOT爲media文件夾,blank=True允許表單的該字段對應值爲空,意思是非必填字段
    avatar = models.ImageField(upload_to='%Y%m%d/', blank=True) 
    # 文件將會上傳到 MEDIA_ROOT/uploads
    upload = models.FileField(upload_to='uploads/')
    # 文件將會保存到 MEDIA_ROOT/uploads/2015/01/30
    upload = models.FileField(upload_to='uploads/%Y/%m/%d/')

完整實例
例子: 包含了大多數數據類型,可供參考
##################################################################
from django.db import models
#服務器存放地:阿里雲,華爲雲,騰訊雲,地區機房,企業機房
class idc(models.Model):
    name = models.CharField(max_length=100,verbose_name=u'地區名稱',default="")
    class Meta:
        db_table = 'idc'
        verbose_name = "地區[idc]"
        verbose_name_plural = "地區[idc]"

    def __str__(self):
        return self.name
#應用程序:nginx,tomcat,mysql,mognodb等
class app(models.Model):
    name = models.CharField(max_length=100,verbose_name=u'應用名稱',default="")
    class Meta:
        db_table = 'app'
        verbose_name = "應用[app]"
        verbose_name_plural = "應用[app]"

    def __str__(self):
        return self.name    

#服務器:
class server(models.Model):
    server_status_choice=((0,'正常'),(1,'異常'),)
    name = models.CharField(max_length=100,verbose_name=u'主機名稱',default="")
    #服務器縮略圖
    img = models.ImageField(upload_to='article_img/%Y%m%d/', verbose_name='縮略圖', blank=True, null=True)
    #一對多模型模型實現idc
    idc = models.ForeignKey(idc,related_name='idc_server',on_delete=models.CASCADE,verbose_name=u'idc',default="")
    #小整數[-32768,32768]
    status = models.SmallIntegerField(choices=server_status_choice, default=0, verbose_name='服務狀態')
    #ip格式
    ip = models.GenericIPAddressField(verbose_name=u'ip地址',default="")
    #字符串格式
    domain =  models.CharField(max_length=100,verbose_name=u'域名',default="")
    #常整型格式
    cpu = models.IntegerField(default=9999,verbose_name=u'cpu',)
    disk = models.IntegerField(default=9999,verbose_name=u'磁盤',)
    mem = models.IntegerField(default=9999,verbose_name=u'內存',)
    network = models.FloatField(verbose_name=u'帶寬',default=0)
    #浮點數,network不應該是浮點數,這裏只是爲了測試而已
    ssh = models.CharField(max_length=100,verbose_name=u'sh地址',default=""),
    #正整數[0-2147483647]
    port = models.PositiveIntegerField(verbose_name=u'ssh端口',default="0")
    #多對多模型實現應用名稱
    app_name = models.ManyToManyField(app,blank=True,verbose_name=u'應用名稱',)
    #上面的時間是不會再admin後臺顯示的
    created_time = models.DateTimeField('發佈時間', auto_now_add=True)
    modified_time = models.DateTimeField('修改時間', auto_now=True)
    #如果不想自動填寫,可不寫auto_now=True默認False
    created_times = models.DateField(verbose_name=u'購買時間',)
    DeadlineDate = models.DateTimeField(verbose_name=u'截止日期',)
    #上下線狀態這裏採用Boolean方式
    statuss = models.BooleanField(verbose_name=u'上線',default=False)
    #告警郵箱
    email = models.EmailField(verbose_name=u'告警郵箱',default='[email protected]')     #郵箱
    #文本格式實現備註
    remarks =  models.TextField(verbose_name=u'備註',default="")

    def __str__(self):
        return self.name
    class Meta:
        db_table = 'server' #設置數據表名
        unique_together = (("name","ip","domain","email"),) #設置哪些字段不可有重複數據
        verbose_name = "主機[server]" #admin頁面顯示
        verbose_name_plural = "主機[server]"

##################################################################



舉例:參考https://blog.csdn.net/weixin_37773766/article/details/80330221    
class test(models.Model):    
    userName = models.CharField(max_length=30)   #用戶名
    passWord = models.CharField(max_length=30)   #密碼
    gendle = models.BooleanField()               #性別
    birthday = models.DateField()                   #出生日期
    weigth = models.FloatField()                 #體重
    heigth = models.IntegerField()                  #身高
    email = models.EmailField()                  #郵箱
    host = models.GenericIPAddressField()          #IP地址
    introduce = models.TextField()               #個人簡介
    blog = models.URLField()                     #博客地址
    photo = models.ImageField()                  #照片
    #CV = models.FilePathField()                  #個人簡歷文件
    createDate = models.DateTimeField()            #帳號申請時間
    def __str__(self):
        return self.userName
    class Meta:
        db_table = 'test'
        verbose_name = "測試[test]"
        verbose_name_plural = "測試[test]"
#####################################################
說明:    
 class Meta:
        ordering = ['datetime'] #排序方式
        unique_together = (("url","email"),)
        #verbose_name = '測試表' #單數
        verbose_name_plural = '測試表'#複數
        #db_table = 'Test Table' #設置當前表在創建時候的名字
        #app_label = '' 指明當前的模型類屬於哪個app
    #每一個表的實例是一條數據
def __str__(self):
    return str(self.datetime)
admin頁面顯示簡單設置
from django.contrib import admin
from blog.models import idc,server,app

#設置admin列表頁面
from django.contrib import admin
from blog.models import idc,server,app
#設置admin列表頁面
#serverAdmin 由 server表+ Admin組成 ,list_display中的字段指定需要顯示的字段
class serverAdmin(admin.ModelAdmin):
    list_display = ['name','idc','domain']

admin.site.register(server,serverAdmin) #重要的是導入serverAdmin及server
admin.site.register([idc,app])

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章