Django--登錄功能


登錄功能:

  1、路由訪問如果不加斜杠,內部會重定向加斜杠的路由

 

所有的html文件都默認卸載templates文件夾下面

所有的(css,js,前端第三方的類庫)默認都放在static文件夾下

html頁面引入外部資源的方式

  1、cdn

  2、本地

 

靜態文件配置:

STATIC_URL = '/static/'
# 靜態文件配置
STATICFILES_DIRS = [
    os.path.join(BASE_DIR,'static')
]
# 暴露給外界能夠訪問服務器靜態文件夾下面所有的資源


STATIC_URL = '/xxx/'  # 接口前綴 跟你的靜態文件夾的名字一點關系都沒有
# 默認情況下這個前綴跟靜態文件夾名字一樣!!!
# 靜態文件配置
STATICFILES_DIRS = [
    os.path.join(BASE_DIR,'static'),  # 就是你的靜態文件夾路徑
    os.path.join(BASE_DIR,'static1'),
    os.path.join(BASE_DIR,'static2')
]
# ps:會依次查找列表中所有的靜態文件路徑 找到的話立刻停止,都沒有找到返回404

 

 

form表單出發提交數據的兩種方式:

<input type="submit">
<button></button>

 

 

form提交數據的地址如何指定以及方式:

  action屬性控制提交的地址

  方式:

    1、全路徑

<form action="http://127.0.0.1:8000/login/">

 

    2、只寫了路徑的后綴

<form action="/login/">

 

    3、不寫(默認往當前的路徑提交)

  form表單默認的是get請求

 

 

 request.POST:就是一個大字典,里面存放了客戶端post提交的所有的數據


print(request.POST.get('username')) # 不推薦使用

<QueryDict: {'username': ['william'], 'password': ['123']}>

print(request.POST.getlist('username'))  # 推薦使用這種,一次性拿到value列表中所有的元素
 
        

 

 這里面value雖然是個列表但是獲取value的時候拿到的卻是單個元素?

  默認只會取value列表中的最后一個元素

要是想取列表中的全部的內容需要使用getlist

  使用場景:用戶的愛好、多選框...

 

 GET請求原理也相同,使用方法也一樣

 

建議版本的連接數據庫:

def login(request):
    if request.method == 'POST':
        username = request.POST.get("username")
        password = request.POST.get('password')
        # print(username, password)
        conn = pymysql.connect(
            host='127.0.0.1',
            port=3306,
            user='root',
            password='123456',
            db='test',
            charset='utf8',
            autocommit=True,
        )
        cursor = conn.cursor(pymysql.cursors.DictCursor)
        cursor.execute("select * from user_info where name=%s and password=%s", (username, password))
        user_info = cursor.fetchall()
        # print(user_info)
        if user_info:
            return HttpResponse('login_success!!!')
    return render(request, 'login.html')

 

 

Django連接本地數據庫(Database):

 

 首次使用需要下載數據庫的驅動:

 

填寫用戶名、密碼以及相對應的數據庫,完成之后可以測試連接一下:

創建完成之后,如果出現無法打開schemas的情況,那就要先右鍵單擊schemas,然后選擇Database Tools工具欄里面的Force Refresh來進行強制刷新。

 

 

 

 

 Django連接數據庫:

  1、修改配置文件(內部所有的鍵都需要大些)

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

 

   2、告訴Django用pymysql替換它默認的mysql_db模塊連接數據庫

    方式一:在你的項目文件夾下面的__init__.py   

import pymysql

pymysql.install_as_MySQLdb()  # 告訴Django用pymysql代替mysqldb的連接數據庫

    方式二:在你的應用文件夾下面的__init__.py 

 

 

 Django中的ORM:

  ORM:對象關系映射:

    類 --> 表

    對象 --> 表記錄

    對象點屬性 --> 記錄中的某一個字段對應的值

  Django的orm不能自動幫你創建庫,但時候自動幫你創建表

  提示:

    一個Django項目就是用一個庫,不要多個Django項目使用一個

 

數據庫遷移(同步)命令(重點):

  這兩句話必須同時出現,不能缺少其中的一句。。。

  manage.py makemigrations --> 將你的數據庫變動記錄到一個小本本上面  

數據庫變動的紀錄

  python3 manage.py migrate --> 將你的數據庫變動同步到數據庫中

 

 編寫注冊功能:

def reg(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        # # 方式一:
        # user_obj = models.User.objects.create(name=username, password=password)
        # user_obj.save()  # 對象調用save對象保存到數據庫
        # 方式二:
        user_obj = models.User.objects.create(name=username, password=password)
        print(user_obj)
        return HttpResponse("register success!!!")
    return render(request, 'reg.html')

 

 

   通過POST請求提交數據到服務端,在服務端將用戶的數據插入到數據庫表中

 

 查詢數據(獲取數據庫信息):

  user_list = models.User.objects.all()  --> select id, name, password from user;

  只要是QuerySet對象就可以點query來查看獲取當前的QuerySet對象的內部的sql語句 

  query對象支持索引取值,但是不推薦使用,推薦使用自帶的.first()幫你獲取第一條數據

  需要注意的點:你獲取到的數據到底是一個queryset對象還是一個數據對象,如果是數據對象的話就一定要調用first方法

 

 <a href="/reg/" class="btn btn-success">添加數據</a>
# 注意路:徑的書寫一定要加斜杠


# 利用a標簽href屬性,可以指定頁面跳轉的路徑
# 在a標簽內部添加路徑,可以是全路徑,但是更推薦止血后綴即可

  ps:視圖函數必須返回HttpResponse對象 

查詢數據的兩種方式:

# 查詢數據的方式一:
user = models.User.objects.filter(id=edit_id)
# filter當條件不存在的時候,會返回一個空的queryset對象
# 查詢數據的方式二"
user_obj = models.User.objects.get(id=edit_id)  

# 用get可以直接拿到數據對象的本身,但是如果數據不存在就直接報錯

 

 

   

  

刪除數據:

def delete_user(request):
    delete_id = request.GET.get('delete_id')
    models.User.objects.filter(id=delete_id).delete()  #
    return redirect('/userlist/')

 

  .delete會將query內的所有的對象全部刪除

  內部重定向:利用return redirect('/userlist/')  # 括號里面可以寫 別人的網址,也可以寫自己的路徑,后面的那個反斜杠可以加可以不加,但是推薦加上,避免出現不必要的錯誤。

  

編輯數據庫中的數據:

  修改當前數據對象:

    方式一:

user_obj = models.User.object.filter(id=edit_id).frist()
user_obj.name = user_name
user_obj.save()


# 這種方法如果不修改指定的數據就是原先已經存在的數據

 

  方式二:

  在編輯的時候,要先找到那一行數據,然后開啟一個新的網頁來進行編輯,編輯完之后,要進行重定向會userlist的頁面。

  定向的時候可以直接使用update方法來進行修改數據,在使用update的時候會講那一條字段中的所有信息進行修改 a

  提交數據的時候是用post請求提交的數據,然后直接在請求體中將數據拿出來進行修改。。。

# views
def
edit(request): if request.method == 'POST': username = request.POST.get("username") password = request.POST.get("password") # 更新數據 edit_id = request.POST.get('edit_id') models.User.objects.filter(id=edit_id).update(name=username, password=password) return redirect('/userlist/') # print(username, password) # edit_id = request.POST.get("username") # print(edit_id) # 更新數據庫 # 現獲取到ID edit_id = request.GET.get('edit_id') # 將該數據查詢出來渲染到一個頁面 # 查詢數據的方式一: user_obj = models.User.objects.filter(id=edit_id).first() # 查詢數據的方式二" # user_obj = models.User.objects.get(id=edit_id) # 拿到的數據的對象,如果數據不存在就直接報錯 # print(user.pk, user.name, user.password) return render(request, 'edit.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>
    <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>編輯數據</h1>
        <div class="col-md-6 col-md-offset-3">
            <form action="" method="post">
                <input type="hidden" name="edit_id" value="{{ user_obj.pk }}">
                <p>username:<input type="text" name="username" value="{{ user_obj.name }}" class="form-control"></p>
                <p>password:<input type="text" name="password" value="{{ user_obj.password }}" class="form-control"></p>
                <input type="submit" class="btn btn-warning">
            </form>
        </div>
    </div>
</div>
</body>
</html>

 

 

 

修改模型層里面跟表相關的所有的數據,只要你修改了就必須重新執行數據庫遷移命令:

  python3 manage.py makemigrations  將你的數據庫變動記錄到一個小本本上面

  python3 manage.py migrate  真正操作數據庫

  這兩句話是同時出現的,不能缺少其中一句。。。

 

  新建一個字段,

    就要添加字段名的默認值,直接添加在CharField中加一個default參數就可以了,就會自動將之前已經存在的數據自動加上你在添加的這個默認值。

  刪除一個字段,就直接將那個字段刪掉,然后在執行那兩句話,之后就會自動刪除了

  

Django請求生命周期:

 

圖書管理系統表設計:

  書籍:id、title、price、publish_id(出版社ID)

  作者:id、name、age

  出版社:id、name、email

  book2author:id、book_id、author_id

  

  在設計表的時候,可以不寫ID,會默認幫你創建一個主鍵ID

創建數據庫表:

class Book(models.Model):
    # 不寫ID會默認幫你創建一個主鍵ID
    title = models.CharField(max_length=32)
    price = models.DecimalField(max_length=8, decimal_places=2, max_digits=2)
    # 一對多外鍵字段的建立
    publish = models.ForeignKey(to='Publish')  # 默認是和Publish表的ID字段建立連接
    # 多對多外鍵字段建在關聯的兩張表的任意一張都可以  建議你建在查詢頻率比較高的一張
    author = models.ManyToManyField(to='Author')
    # 多對多字段,不會顯示到表的字段中


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


class Author(models.Model):
    name = models.CharField(max_length=32)
    age = models.IntegerField(max_length=32) 

 

 外鍵字段名 orm會自動在字段名后面加上_id,無論你的后面是否有ID都會在后面加上_id

 


免責聲明!

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



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