django的簡單使用

用戶訪問內容

用戶可以訪問的全部的資源,都是程序猿提早暴露的,若是沒有暴露,用戶是不能進行訪問的。html

diango重啓的問題

,當咱們更改django中的代碼的時候,django內部會檢測到咱們更改,因此會重啓。django是能夠自動重啓的 可是有時候反應速度比較慢,也有可能在你代碼沒寫完的時候重啓了 會報錯 可是不用管,修改完畢後,能夠本身進行啓動。前端

diango中的三板斧,主要用於先後端的交互

  1. 必需要有返回值
from django.shortcuts import render,HttpResponse,redirect
        HttpResponse  # 返回字符串
        
        render  # 返回html頁面 而且能夠給該html傳值
        
        redirect  # 重定向
            # 既能夠是咱們本身的路徑也能夠是網上的路徑
        
        django返回的都是HttpResponse對象
def player(request):
    res = HttpResponse('dfdf')
    print(res)
    return res





from django.template import Template,Context
def test(request):
#能夠直接解析html
    return HttpResponse("<h1>哈嘍</h1>")
    # res = Template("<h1>{{user}}</h1>")
    # con = Context({"user":"json",'pwd':123})
    # ret = res.render(con)
    # print(ret)
    # return HttpResponse(ret)
def sing(request):
    res = redirect('/login')
    print(res)
    return res
def dance(request):
    res = render(request, 'cuang.html')
    print(res)
    return res

能夠加入參數:參數會返回cuang.html頁面中,進行渲染頁面
def reg(request):
    user_dict = {'name':'jason','pwd':123}
    # return render(request,'reg.html')
    # 給模板傳值的方式1
    # return render(request, 'reg.html',{'xxx':user_dict})  # 將user_dict傳遞給reg.html頁面 頁面上經過xxx就可以獲取到該字典
    # 給模板傳值的方式2
    return render(request,'reg.html',locals())  # 會將當前名稱空間中全部的變量名所有傳遞給reg.html頁面
    # locals()  會出現效率問題

靜態文件的配置

  1. 用戶可以在瀏覽器中輸入網址訪問到相應的資源
  2. 前提是後端暴露了該資源的接口
  3. 在django中若是你想讓用戶訪問到對應的資源,咱們只須要在urls.py中設置對應的關係。
  4. 反過來若是我沒有urls.py中開設資源,用戶就永遠訪問不到對應的資源
  5. 返回給瀏覽器的html頁面上的全部的靜態資源,也須要請求後端加載獲取。
  6. 一般咱們將網址所用到的html文件所有放在templates文件夾下,網站用到的靜態資源所有存放到static文件夾下。
2.靜態文件配置

    
    靜態文件
        網站所用到的
            本身寫好js
            本身寫好css
            第三方的框架 bootstrap fontwesome sweetalert,elementui,layui
        
    一般狀況下 網站所用到的靜態文件資源 統一都放在static文件夾下
    STATIC_URL = '/static/'  # 是訪問靜態資源的接口前綴
    """只要你想訪問靜態資源 你就必須以static開頭"""
    # 手動配置靜態文件訪問資源
    STATICFILES_DIRS = [
        os.path.join(BASE_DIR,'static'),
        os.path.join(BASE_DIR,'static1'),
        # os.path.join(BASE_DIR,'static2'),
    ]
    
    html中   接口前綴 動態解析,這樣能夠修改STATIC_URL,在html中依舊能夠檢測到css,js
    {% load static %}
    <link rel="stylesheet" href="{% static 'bootstrap/css/bootstrap.min.css' %}">
    <script src="{% static 'bootstrap/js/bootstrap.min.js' %}"></script>

diango orm簡介

orm對象關係映射
        
        類                   數據庫的表
        
        對象                  表的記錄
        
        對象獲取屬性          記錄的某個字段對應的值

優勢:

可以讓一個不會數據庫操做的人 也可以簡單快捷去使用數據庫
python

缺點:

因爲封裝程度過高 可能會致使程序的執行效率偏低

有時候 結合項目需求 可能須要你手寫sql語句jquery

注意事項:

1.django的orm不會自動幫你建立庫,庫須要你本身手動建立
表會自動幫你建立 你只須要書寫符合django orm語法的代碼便可git

去應用下所在的models.py中書寫類
    
    from django.db import models

    # Create your models here.
    class Userinfo(models.Model):
        # 設置id字段爲userinfo表的主鍵  id int primary key auto_increment
        id = models.AutoField(primary_key=True)  # 在django中 你能夠不指定主鍵字段 django orm會自動給你當前表新建一個名爲id的主鍵字段
        # 設置username字段  username varchar(64)  CharField必需要指定max_length參數
        username = models.CharField(max_length=64)  # 在django orm中 沒有char字段  可是django 暴露給用戶 能夠自定義char字段
        # 設置password字段  password int
        password = models.IntegerField()

orm中最重要的倆條命令(數據庫遷移(同步)命令)

  1. 當你第一次執行上面兩條命令的時候 django會自動建立不少張表 這些表都是django默認須要用到的表
  2. 你本身寫的模型類所對應的表 表名有固定格式:應用名_表名

方式1:命令行輸入

******************************數據庫遷移(同步)命令***********************************   

    
    python manage.py makemigrations  # 不會建立表 僅僅是生成一個記錄  將你當前的操做記錄到一個小本本上(migrations文件夾)
    
    python manage.py migrate  # 將你的orm語句真正的遷移到(同步)到數據庫中
    
    
    只要你在models.py中修改了跟數據庫相關的代碼  你就必須從新開始執行上面兩條命令

方式二:快捷輸入


form表單的應用

  1. form表單 action參數能夠寫的形式
    1.不寫 默認往當前地址提交
    2.寫後綴 /index 朝着本網站的index路徑提交數據
    3.寫全路徑 http://www.xiaohuar.com
  2. form表單默認朝後端提交的方式 默認是get請求,你能夠經過method參數修改提交方式,前端獲取用戶輸入的信息 會被存放在input/option/...標籤的value屬性中
  3. get請求攜帶參數的方式 是在url後面?
    如:url?username=admin&password=213213213213213
    缺點
    1.不安全
    2.get請求攜帶的參數有大小限制(最大不能超過4KB左右)
  4. 前期你若是要提交post請求 你就去settings.py文件註釋掉一箇中間件
前期你若是要提交post請求 你就去settings.py文件註釋掉一箇中間件
    MIDDLEWARE = [
            'django.middleware.security.SecurityMiddleware',
            'django.contrib.sessions.middleware.SessionMiddleware',
            'django.middleware.common.CommonMiddleware',
            # 'django.middleware.csrf.CsrfViewMiddleware',
            'django.contrib.auth.middleware.AuthenticationMiddleware',
            'django.contrib.messages.middleware.MessageMiddleware',
            'django.middleware.clickjacking.XFrameOptionsMiddleware',
        ]

request對象以及方法

  1. request.method:獲取前端的請求方式 而且是大寫的字符串形式
  2. 請求方式
    get
    post
    二者都可以攜帶數據,可是get請求攜帶的數據是直接拼接在url後面 不安全而且數據大小有限制
先後端數據交互
        如何獲取請求方式
            
        
        
        獲取post請求攜帶的數據
            request.POST
           
        獲取get請求攜帶的數據
            request.GET
        get和post在後端獲取用戶數據的時候 規律是同樣的
        
        
        request.GET  # 你就把它當成一個大字典 裏面放的是get請求攜帶過來的數據
        request.POST  # 你就把它當成一個大字典 裏面放的是post請求攜帶過來的數據
        """上面的大字典 全部的value都是一個列表"""
        
        request.GET.get('key')  # 默認取的是列表的最後一個元素 並非直接將列表取出
        request.GET.getlist('key')  # 直接將value的列表取出
        
        
        request.POST.get('key')  # 默認取的是列表的最後一個元素 並非直接將列表取出
        request.POST.getlist('key')  # 直接將value的列表取出
        
        
        如:
        
        <QueryDict: {'username': ['admin', 'tank'], 'password': ['123']}>
        tank <class 'str'>
        123 <class 'str'>
        request.POST.get('username') 默認只取列列表的最後一個元素
        若是你想將列表完整的取出 你必須用getlist()

數據的處理

建立表(多種關係)

from django.db import models

# Create your models here.
class Book(models.Model):
    title = models.CharField(max_length=32)
    # 總共八位 小數佔兩位
    price = models.DecimalField(max_digits=8,decimal_places=2)

    # 書和出版社是一對多的關係  外鍵字段鍵在多的一方
    publish_id = models.ForeignKey(to='Publish')  # to指定跟誰是外鍵關聯的  默認關聯的是表的主鍵字段
    """
    ForeignKey字段  django orm在建立表的時候 會自動給該字段添加_id後綴
    """
    # 書和做者是多對多的關係  外鍵字段建在任何一方均可以  可是 推薦你建在查詢頻率比較高的一方
    authors = models.ManyToManyField(to='Author')
    """authors字段僅僅是一個虛擬字段 不會再表中展現出來  僅僅是用來告訴django orm 書籍表和做者表示多對多的關係
        自動建立第三張表 
    """

class Publish(models.Model):
    name = models.CharField(max_length=32)
    addr = models.CharField(max_length=255)


class Author(models.Model):
    name = models.CharField(max_length=32)
    phone = models.BigIntegerField()
    # 一對一字段 建在哪張表均可以  可是推薦你建在 查詢頻率比較高的那張表
    author_detail = models.OneToOneField(to='AuthorDetail')
    """
        OneToOneField字段  django orm在建立表的時候 會自動給該字段添加_id後綴

        """

class AuthorDetail(models.Model):
    addr = models.CharField(max_length=255)
    age = models.IntegerField()

數據操做

​ 表字段的增刪改查
​ 新增的字段
​ 1.直接提供默認值 default
​ 2.設置改字段能夠爲空 null=True
​ 注意的是 不要輕易的註釋models.py中任何跟數據庫相關的代碼
​ 主要是跟數據庫相關的代碼 你在處理的時候必定要當心謹慎sql

class Userinfo(models.Model):
    # 設置id字段爲userinfo表的主鍵  id int primary key auto_increment
    id = models.AutoField(primary_key=True)  # 在django中 你能夠不指定主鍵字段 django orm會自動給你當前表新建一個名爲id的主鍵字段
    # 設置username字段  username varchar(64)  CharField必需要指i定max_length參數
    username = models.CharField(max_length=32)  # 在django orm中 沒有char字段  可是django 暴露給用戶 能夠自定義char字段
    # 設置password字段  password int
    password = models.IntegerField()
    # phone = models.BigIntegerField(default=110)  # 新增的字段 能夠提早設置默認值
    # addr = models.CharField(max_length=64,null=True)  # 新增的字段 能夠設置爲空


    def __str__(self):
        return '我是用戶對象:%s'%self.username

數據的查

  1. get()數據庫

    1. 條件存在的狀況下 獲取的直接是數據對象自己
  2. 條件不存在的狀況下 會直接報錯 因此不推薦你使用get方法查詢數據django

  3. filter()json

    1. 條件存在的狀況下 獲取到的是一個能夠當作列表的數據 列表裏面放的纔是一個個數據對象自己
    2. 條件不存在的狀況下 並不會報錯 返回的是一個能夠當作空列表的數據
    3. filter括號內能夠寫多個參數逗號隔開 這多個參數在查詢的時候 是and關係
    4. filter的結果支持索引取值 可是不支持負數 而且不推薦你使用索引 推薦你使用它封裝好的方法 first取第一個數據對象
    def login(request):
        if request.method == 'POST':
            username = request.POST.get("username")
            password = request.POST.get("password")
            # 先以用戶名爲依據查詢數據
            # 1.get()  當查詢條件不存在的時候 會直接報錯   若是存在會直接給你返回 數據對象自己        不推薦使用
            # res = models.Userinfo.objects.get(username=username)  # select id,username,password from userinfo where username='jason'
            # print(res)
            # print(res.username)
            # print(res.password)
            # 2.filter()   當查詢條件不存在的時候  不會報錯而是返回一個空
            # 當條件存在的狀況下 不管數據有幾條返回的都是列表套對象的數據格式
            # filter能夠當多個查詢條件 而且是and關係
            res = models.Userinfo.objects.filter(username=username)  # select * from userinfo where username='jason' and password=123;
            # user_obj = res[0]
            # user_obj = res[0:3]
            # user_obj = res[-1]  # 你能夠將filter查詢出來的結果當作列表去對待 支持正數的索引取值和切片 不支持負數
            user_obj = res.first()  # 取queryset第一個元素
            print(user_obj)
        return render(request,'login.html')

    數據的增

    1. create()

      1. 括號內些關鍵字參數的形式 建立數據

      2. 該方法會有一個返回值 返回值就是當前對象自己

    2. 利用對象點方法的方式
      user_obj = User(username='jason')
      user_obj.save() # 將當前對象保存到數據庫中

def reg(request):
    if request.method == 'POST':
        username = request.POST.get("username")
        password = request.POST.get("password")
        # 直接將用戶名和密碼寫入數據庫
        # 方式1
        # user_obj = models.Userinfo.objects.create(username=username,password=password)
        # insert into userinfo(username,password) values('admin','666');
        # create方法會有一個返回值  返回值就是當前被建立的數據對象
        # 方式2
        user_obj = models.Userinfo(username=username,password=password)
        user_obj.save()
        
        print(user_obj)
    return render(request,'register.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 href="https://cdn.bootcss.com/twitter-bootstrap/3.3.1/css/bootstrap.min.css" rel="stylesheet">
    <script src="https://cdn.bootcss.com/twitter-bootstrap/3.3.1/js/bootstrap.min.js"></script>

</head>
<body>
<div class="container-fluid">
    <div class="row">
        <div class="col-md-8 col-md-offset-2">
            <h2 class="text-center">編輯頁面</h2>
            <form action="" method="post">
                username:<input type="text" class="form-control" name="username" value="{{ edit_obj.username }}">

                password:<input type="text" class="form-control" name="password" value="{{ edit_obj.password }}">

                <br>
                <input type="submit" class="btn btn-warning">
            </form>

        </div>
    </div>
</div>
</body>
</html>
def edit_user(request):
    # 1.如何獲取用戶想要編輯的數據
    edit_id = request.GET.get('edit_id')
    if request.method == 'POST':
        # 將用戶新修改的全部的數據
        username = request.POST.get("username")
        password = request.POST.get("password")
        """POST中也是能夠獲取GET請求攜帶的參數"""
        # 去數據庫中修改對應的數據
        # 方式1:
        models.Userinfo.objects.filter(pk=edit_id).update(username=username,password=password)  # 批量更新
        # 方式2: 獲取當前數據對象 而後利用對象點屬性的方式 先修改數據  而後調用對象方法保存
        # 不推薦你使用第二種方式  效率低   挨個從新寫入一遍
        # edit_obj = models.Userinfo.objects.filter(pk=edit_id).first()  # pk可以自動幫你查詢出當前表的主鍵字段名
        # edit_obj.username = username
        # edit_obj.password = password
        # edit_obj.save()
        """update方法會將filter查詢出來的queryset對象中全部的數據對象所有更新"""
        # 跳轉到數據展現頁面
        return redirect('/userlist')
    # 2.根據主鍵值去數據庫中查詢出當前對象 展現給用戶看
    edit_obj = models.Userinfo.objects.filter(pk=edit_id).first()  # pk可以自動幫你查詢出當前表的主鍵字段名
    # 3.將查詢出來的數據對象傳遞給前端頁面 展現給用戶看
    return render(request,'edit_user.html',locals())

數據的刪除

<!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>
    {% load static %}
    <link rel="stylesheet" href="{% static 'bootstrap/css/bootstrap.min.css' %}">
    <script src="{% static 'bootstrap/js/bootstrap.min.js' %}"></script>
</head>
<body>
<div class="container-fluid">
    <div class="row">
        <div class="col-md-8 col-md-offset-2">
            <h1 class="text-center">數據展現</h1>
            <table class="table table-hover table-striped table-bordered">
                <thead>
                    <tr >
                        <th>主鍵值</th>
                        <th>用戶名</th>
                        <th>密碼</th>
                        <th class="text-center">操做</th>
                    </tr>
                </thead>
                <tbody>
                    {% for user_obj in user_queryset %}
                        <tr>
                            <td>{{ user_obj.id }}</td>
                            <td>{{ user_obj.username }}</td>
                            <td>{{ user_obj.password }}</td>
                            <td class="text-center">
                                <a href="/edit_user/?edit_id={{ user_obj.id }}" class="btn btn-primary btn-sm">編輯</a>
                                <a href="/delete_user/?delete_id={{ user_obj.pk }}" class="btn btn-danger btn-sm">刪除</a>
                            </td>
                        </tr>
                    {% endfor %}
                </tbody>
            </table>
        </div>
    </div>
</div>
</body>
</html>
def delete_user(request):
    # 獲取想要刪除的數據id 直接刪除
    delete_id = request.GET.get('delete_id')
    models.Userinfo.objects.filter(pk=delete_id).delete()  # 批量刪除
    return redirect('/userlist')
相關文章
相關標籤/搜索