Web框架之Django_02基本操作(Django項目啟動配置、數據庫連接、orm、增刪改查)


摘要:

  • Django項目簡單現實過程

  • pycharm連接數據庫

  • Django之orm簡單操作增刪改查

一、新建Django項目、配置、設置:

  1. 新建Django項目:(為了熟悉Django操作,暫時全部用cmd形式來實現,很多地方需要手動添加)
    項目目錄D:\Django:
    >>管理員權限打開cmd,通過cmd命令進入項目目錄
    >>django-admin startproject my_Dproject      (創建項目)
    >>cd my_Dproject      (進入項目文件夾)
    >>python3 manage.py startapp app01       (創建app)
    >>pycharm打開Django\my_Dproject\my_Dproject\下的settings.py文件,在里面的'INSTALLED_APPS'列表后面添加"app01.apps.App01Config"
    "或者直接添加簡寫"app01"    (注冊項目app:app01)
    >>在settings.py文件內:"TEMPLATES"列表里面第二行'DIRS': [os.path.join(BASE_DIR,'templates')]       (添加templates文件夾路徑)
    >>在settings.py文件內最下面:STATIC_URL = '/static/'下面添加:STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]   (添加靜態文件夾路徑)
  2.  在寫注冊頁面功能時候需要在靜態文件夾內static添加bootstrap文件,以便於我們能夠輕松地對html做一些漂亮的布局。

    html文件添加導入jQuery的js文件、 Bootstrap的css和js文件:

    <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
        <link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.min.css">
        <script src="/static/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>

二、注冊路徑HTML頁面創建:

  1. my_Dproject/my_Dproject/urls.py    在url路由文件中添加注冊功能路徑

  2. 在templates文件夾內新增register.html頁面文件用於用戶請求注冊路徑返回的注冊頁面,進行注冊操作
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>注冊界面</title>
        <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
        <link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.min.css">
        <script src="/static/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
    </head>
    <body>
    <div class="container">
        <div class="row">
            <h2 class="text-center">注冊頁面</h2>
            <div class="col-sm-6 col-sm-offset-3 col-md-6 col-md-offset-3 col-xs-6 col-xs-offset-3">
                <form action="/register/" method="post">
                    <p>用戶名:<input type="text" class="form-control" placeholder="請輸入用戶名" name="username" id="i1"></p>
                    <p>密碼:<input type="text" class="form-control" placeholder="請輸入密碼" name="password" id="i2"></p>
                    <input type="submit" class="btn btn-block btn-info" value="注冊提交">
                </form>
            </div>
        </div>
    </div>
    </body>
    </html>

    開啟my_Dproject項目,在瀏覽器輸入url:http://127.0.0.1:8000/register/

三、處理用戶注冊請求、Django連接MysqL數據庫相關配置、數據庫遷移命令:

  1. my_Dproject/app01/views.py    在views函數文件中添加register函數,來處理用戶注冊的請求。

    Tips:獲取get請求數據的方式跟POST請求完全一樣。
  2. 獲取到用戶注冊信息,接下來需要連接數據庫,拿到數據庫的用戶數據進行驗證,注冊的成功與否。
    Django連接MySQL數據庫的方法:
    my_Dproject/my_Dproject/settings.py    繼續回到settings配置文件中,來配置Django連接MySQL
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'my_Dproject',
            'HOST': '127.0.0.1',
            'PORT': 3306,
            'USER': 'root',
            'PASSWORD': '123',
        }
    }

    還沒完,接着需要去項目的init文件中添加相關信息,告訴Django用MySQL數據庫連接數據庫就行。
    my_Dproject/my_Dproject/__Init__.py中添加下面信息:
    
    import pymysql pymysql.install_as_MySQLdb()
    
    (這里需要注意:__init__.py文件還在app01文件中有,也可以在app01中的init文件中添加,效果一樣。)
  3. 配置添加Django中orm的models文件
    重點Django的orm不能自動幫我們創建數據庫,但是可以自動幫我們創建表同時一個Django項目就使用一個數據庫
    my_Dproject/app01/models.py  中添加映射表的相關類
    這里我們需要用到用戶數據表,所以創建一張User類來映射MySQL數據庫中的user用戶表
    class User(models.Model):
        id = models.AutoField(primary_key=True)
        name = models.CharField(max_length=32)
        password = models.CharField(max_length=16)


    映射表的類創建完畢后,需要進行關鍵的2步【數據庫遷移命令】操作,才能創建出user表:

    第一步:將數據庫變動記錄記錄到一個文件中:
    在pycharm自帶的Terminal命令行中輸入:
    python3 manage.py makemigrations
    
    第二步:將數據庫變動同步到數據庫中:
    python3 manage.py migrate


    重點
    以后只要涉及到數據庫的一絲變動(這里主要說的是表結構),要想讓變動生效一定要執行這2步數據庫遷移(同步)命令!!!

    --------------------------------------------------------------------------------------------------------------------------------------------------
    這里提一個小點:我們在測試時候如果遇到下面這種情況:

    解決辦法是:在settings.py文件中注釋掉一行代碼:

    --------------------------------------------------------------------------------------------------------------------------------------------------

四、Django之orm對MysqL數據庫的增刪改查操作簡介:

  1. 利用Django中orm來查找數據庫中的數據,對數據庫進行增、刪、改、查
    前面我們已經拿到用戶提交的注冊信息:username和password
    語法:
    增:                 
    新增數據
    # 操作數據庫user表新增記錄
    # 方式1:
    user_obj = models.User.objects.create(name=username,password=password)
    # 方式2:
    user_obj = models.User(name=username,password=password)
    user_obj.save()  # 對象調用save方法保存到數據庫




    查:                  

    user_list = models.User.objects.all()  # 獲取user表所有的數據(QuerySet對象)
    # 只要是QuerySet就可以點query查看獲取到當前QuerySet對象的內部sql語句
    
    user_obj = models.User.objects.all().first()   #從上面所有數據的QuerySet對象中取出第一個用戶對象
    
    user_list = models.User.objects.filter(password=555)
    # filter過濾,查找條件password=555的所有用戶數據,返回結果user_list為QuerySet對象(裝有查詢到的全部用戶數據對象的一個容器)
    user_obj = models.User.objects.filter(password=555).first()
    # 取出剛才容器中的第一個用戶數據對象。



    Tips:除了用filter定位表記錄的方法,還可以使用.get()方法:

    user_obj = models.User.objects.get(password='555')
    這樣查會報錯:get() returned more than one User -- it returned 2!
    原因:用get方法是直接獲取單數據對象本身,報錯的原因在於根據password='555'查詢的數據是2個結果,那么就不是單個數據對象,所以就報錯了!
    
    強調:用get方法查詢條件不存在的時候會直接報錯。
    
    所以:不推薦使用get,推薦使用filter查詢,就算條件不存在,會返回一個空的QuerySet對象(<QuerySet []> <class 'django.db.models.query.QuerySet'>)

    --------------------------------------------------------------------------------------------------------------------------------------------------
    這里引入一個小點:將查詢到的的所有表記錄傳給html文件,進行頁面渲染之后展現給用戶
    templates文件夾內創建user_list.html文件:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
        <link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.min.css">
        <script src="/static/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
    </head>
    <body>
        <div class="container">
            <div class="row">
                <h1 class="text-center">用戶數據表</h1>
                <div class="col-md-8 col-md-offset-2">
                    <table class="table-hover table-bordered table-striped table">
                        <thead>
                            <tr>
                                <th>ID</th>
                                <th>name</th>
                                <th>password</th>
                            </tr>
                        </thead>
                        <tbody>
                            {% for user_obj in user_list %}
                                <tr>
                                    <td>{{ user_obj.pk }}</td>
                                    <td>{{ user_obj.name }}</td>
                                    <td>{{ user_obj.password }}</td>
                                </tr>
                            {% endfor %}
                        </tbody>
                    </table>
                </div>
            </div>
        </div>
    </body>
    </html>


    創建一個展示用戶數據的url路徑:
    my_Dproject/my_Dproject/urls.py中添加:

    url(r'^user_list/', views.user_list)

    創建路徑函數:
    my_Dproject/app01/views.py中加函數:

    def user_list(request):
        user_list = models.User.objects.all()
        return render(request, 'user_list.html', {"user_list": user_list})
    
    后面的字典還可以替換成locals(),代表函數內所有變量我當做參數傳進前面的html文件中,進行動態頁面渲染:
        return render(request, 'user_list.html', locals())


    開啟my_Dproject項目,在瀏覽器輸入url:http://127.0.0.1:8000/user_list/

    這就是剛才我們通過增的操作,創建的user表和表中的2條記錄。

    --------------------------------------------------------------------------------------------------------------------------------------------------
    改:               
    首先需要明白一點:改是建立在已經查到的數據基礎上修改對應字段值的,所以改的前提必須有一個查的過程:
    鎖定單個表記錄,用filter:

    user_obj = models.User.objects.filter(id=edit_id).first()
    
    # 再次強調如果不加.first(),返回的結果是一個QuerySet對象,而不是用戶數據對象
    
    改:
    方式一:
    models.User.objects.filter(id=edit_id).upadte(name='banana', password='666')
    注意:方式一update修改的數據可能不是一條記錄,有可能把查詢到的多條記錄的name和password的值全部改成banana和666,類似於批量操作。
    當然如果能確定filter對象的唯一性比如條件為primary_key的id那么查找的數據肯定是一條記錄,這樣也可看作單個記錄修改。
    
    方式二:
    user_obj = models.User.objects.filter(id=edit_id).first()
    user_obj.name = 'banana'
    user_obj.name = '666'
    user_obj.save()

    編輯對象獲取方式:
    我們在表記錄修改的時候一般都是需要獲取到該條表記錄的主鍵id值,這樣就能精確定位修改該條記錄了。所以需要一些手段來傳遞id值:

    編輯對象的id的獲取方式
    方式1:利用input隱藏一個標簽
    <input type="hidden" name="edit_id" value="{{ user_obj.pk }}">
    
    方式2:
    form表單中加入GET請求數據,在views函數方法中通過request.GET.get(edit_id)來獲取需要修改的id
    (雖然請求方式是POST,但可以在標簽內加入GET請求參數,在views函數中能夠同時通過request.POST和request.GET方法拿到不同的數據)
    <form action="/edit/?edit_id={{ user_obj.pk }}" method="post">

    刪:             
    刪除和修改方法類似:

    方法一:
    models.User.objects.filter(password='555').delete()  # 會將queryset所有的數據對象全部刪除
    方法二:
    user_obj = models.User.objects.filter(password='555').first()
    user_obj.delete()

    最后補充一張Web框架實現的最基礎的流程圖:(后期不斷完善中...)







    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM