Django第4步_理解form表單類與處理html的post、get

表單類

用戶登陸框
可以用純粹的html代碼來編寫,也可以用django中的forms編寫
創建forms.py來寫這個表單數據
在這裏插入圖片描述
在python控制檯打印查看login_form,結果就是html代碼

在這裏插入圖片描述
既然這樣爲什麼不直接用html寫?
form不會這麼無聊,它可以暫存表單數據,充當臨時容器
就好像我們用C++進行值交換時候

void exchange(int &x,int &y)
{
	int temp=x;//臨時變量temp
	x=y;
	y=temp;
}

類似臨時變量temp,form表單就可以充當一個臨時容器存儲數據
form表單寫一個臨時存儲數據
有個重點
就是我們寫html的表單數據提交時在表單添加{%crsf_token%}
cross-site request forgery,跨站請求仿造(因爲django內置了一個crsf中間鍵)
避免前端通過post方式提交數據被django禁止
查看django內置的django.middleware.csrf.CsrfViewMiddleware
在這裏插入圖片描述
接下來介紹html的變量標籤塊標籤
變量標籤{{p.Person_name}}
快標籤{% if Persons%}
請看下面的html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>模型交易平臺首頁</title>
</head>
<body>
用戶信息:
{% if Persons %}
    <ol>
        {% for p in Persons %}
            <li>
                <p>用戶名:{{  p.Person_name }}</p>
                <p>用戶金幣:{{ p.Person_money }}</p>
                <p>用戶賬號:{{ p.Person_id }}</p>
            </li>
        {% endfor %}
    </ol>
{% else %}
    No Person.
{% endif %}
</body>

</html>

在這裏插入圖片描述
簡單的測試ok!
接下來寫一個form表單數據匹配html的表單標籤來進行登錄

from django import forms
from .models import *#導入有戶模型
#僅僅使用用戶名和密碼登錄,和html的id一致
class LoginForm(forms.Form):
    username=forms.CharField()
    password=forms.CharField(widget=forms.PasswordInput)

ok,接下來在views視圖函數寫一個查找用戶函數Find_Person
存在返回1否則返回0

def Find_Person(P_name,P_pwd):
    Person_name=models.Person.objects.order_by('Person_name')#名字排序
    for p in Person_name:
        print(p.Person_name,p.Person_pwd)
        if p.Person_name==P_name and p.Person_pwd==P_pwd:
            return 1
    return 0

寫登錄函數

def Person_login(request):
    if request.method =='POST':
        print('post方法')
        P_form=forms.LoginForm(request.POST)#表單數據
        print('表單數據獲取成功')
        if P_form.is_valid():#數據是否合法
            print('數據合法')
            cd=P_form.cleaned_data
            P_name=cd['username']
            P_pwd=cd['password']
            print(P_name,P_pwd)
            user=Find_Person(P_name,P_pwd)#對比數據
            if user:
                return HttpResponse("登錄成功")
            else:
                return HttpResponse("沒有該用戶")
        else:
            return HttpResponse("數據不合法")
    else:
        P_form=forms.LoginForm()
        print('不是post方法')
    return render(request,'adminpage/login.html',{'form':P_form})

借用django的登陸界面仿寫login.html
還有css這裏就不一一展示了,django框架裏面都有


<!DOCTYPE html>

<html lang="en-us" >
<head>
<title>Log in | Django site admin</title>
<link rel="stylesheet" type="text/css" href="/static/admin/css/base.css">
<link rel="stylesheet" type="text/css" href="/static/admin/css/login.css">
    <meta name="viewport" content="user-scalable=no, width=device-width, initial-scale=1.0, maximum-scale=1.0">
    <link rel="stylesheet" type="text/css" href="/static/admin/css/responsive.css">
<meta name="robots" content="NONE,NOARCHIVE">
</head>
<body class=" login"
  data-admin-utc-offset="0">
<!-- Container -->
<div id="container">
    <!-- Header -->
    <div id="header">
        <div id="branding">
<h1 id="site-name"><a href="/admin/">模型交易平臺用戶登錄</a></h1>
        </div>
    </div>
    <!-- END Header -->
    <!-- Content -->
    <div id="content" class="colM">
<div id="content-main">
<form action="/demo/login/" method="post" id="login-form"><input type="hidden" name="csrfmiddlewaretoken" value="u7XrpxUTWRgYFbI2hvlKzrb1NCqReMg38ciAfTLuF38EqLK5Xa2JiLWlFNgFozQG">
    {% csrf_token %}
  <div class="form-row">
    <label class="required" for="id_username">用戶名:</label> <input type="text" name="username" autofocus required id="id_username">
  </div>
  <div class="form-row">

    <label class="required" for="id_password">密碼:</label> <input type="password" name="password" required id="id_password">
    <input type="hidden" name="next" value="/admin/">
  </div>
  <div class="submit-row">
    <label>&nbsp;</label><input type="submit" value="登錄">
  </div>
</form>
</div>
        <br class="clear">
    </div>
    <!-- END Content -->
    <div id="footer"></div>
</div>
<!-- END Container -->
</body>
</html>

測試匹配路徑urls.py

from django.contrib import admin
from django.urls import path,include
from demo00 import views
urlpatterns = [
    path('',views.index,name='demo'),
    path('login/',views.Person_login,name='Person_longin'),
    path('register/',views.Person_register,name='register'),
]

ok,進入http://127.0.0.1:8000/demo/login/
在這裏插入圖片描述
點擊登錄,登錄成功
在這裏插入圖片描述
在這裏插入圖片描述
ok,沒問題!
接下來在forms.py寫一個註冊用戶模型的RegisterForm
這個引用ModelForm
還要注意一個細節因爲註冊用戶時候有些信息沒必要填寫,需要排除屬性可以使用exclude列表
也可以使用fields元組,這裏我使用fields元組

#用戶註冊填寫所有信息 ModelForm
class RegisterForm(forms.ModelForm):
    class Meta:
        model=Person#表單數據寫入models的Person
        fields=("Person_name","Person_id","Person_image","Person_pwd")#不必在表單中向數據模型的字段賦值,也可用exclude列表
        #意思就是註冊用戶名、賬號、頭像、密碼這幾個數據,其他的默認空

views.py寫註冊Person函數

def Person_register(request):
    if request.method=='POST':
        print('post方法')
        Person_form=forms.RegisterForm(request.POST)#html數據提交到表單數據
        print(Person_form)
        if Person_form.is_valid():
            print('數據合法')
            new_Person=Person_form.save()#保存到數據庫,默認無評論和vip,未充值
            new_Person.save()
            return HttpResponse('註冊成功')
        else:
            print('不合法數據')
            return HttpResponse('不能註冊')
    else:
        Person_form = forms.RegisterForm()  # html數據提交到表單數據
        print('get方法')
    return render(request,'adminpage/register.html',{'form':Person_form})

運行打印一下,目的是查看它與html對應的標籤
在這裏插入圖片描述
ok,提取出來

<tr><th><label for="id_Person_name">Person name:</label></th><td><input type="text" name="Person_name" maxlength="8" id="id_Person_name"></td></tr>
<tr><th><label for="id_Person_id">Person id:</label></th><td><ul class="errorlist"><li>This field is required.</li></ul><input type="text" name="Person_id" maxlength="8" required id="id_Person_id"></td></tr>
<tr><th><label for="id_Person_image">Person image:</label></th><td><input type="file" name="Person_image" accept="image/*" id="id_Person_image"></td></tr>
<tr><th><label for="id_password1">Password:</label></th><td><ul class="errorlist"><li>This field is required.</li></ul><input type="password" name="password1" required id="id_password1"></td></tr>
<tr><th><label for="id_password2">Confirm Password:</label></th><td><ul class="errorlist"><li>This field is required.</li></ul><input type="password" name="password2" required id="id_password2"></td></tr>

接下來寫到註冊的html裏面register.html



<!DOCTYPE html>

<html lang="en-us" >
<head>
<title>模型交易平臺註冊登錄</title>
<link rel="stylesheet" type="text/css" href="/static/admin/css/base.css">
<link rel="stylesheet" type="text/css" href="/static/admin/css/login.css">
    <meta name="viewport" content="user-scalable=no, width=device-width, initial-scale=1.0, maximum-scale=1.0">
    <link rel="stylesheet" type="text/css" href="/static/admin/css/responsive.css">
<meta name="robots" content="NONE,NOARCHIVE">
</head>
<body class=" login"
  data-admin-utc-offset="0">
<!-- Container -->
<div id="container">
    <!-- Header -->
    <div id="header">
        <div id="branding">
<h1 id="site-name"><a href="/admin/">模型交易平臺用戶註冊</a></h1>
        </div>
    </div>
    <!-- END Header -->
    <!-- Content -->
    <div id="content" class="colM">
<div id="content-main">
<form action="/demo/register/" method="post" id="login-form"><input type="hidden" name="csrfmiddlewaretoken" value="u7XrpxUTWRgYFbI2hvlKzrb1NCqReMg38ciAfTLuF38EqLK5Xa2JiLWlFNgFozQG">
    {% csrf_token %}
      <div class="form-row">
          <label class="required" for="id_Person_name">Person name:</label><ul class="errorlist">用戶名</ul><input type="text" name="Person_name" maxlength="8" id="id_Person_name">
      </div>

    <div class="form-row">
        <label class="required" for="id_Person_id">Person id:</label><ul class="errorlist">賬號</ul><input type="text" name="Person_id" maxlength="8" required id="id_Person_id">
    </div>

    <div class="form-row">
    <label class="required" for="id_Person_image">Person image:</label><ul class="errorlist">頭像</ul><input type="file" name="Person_image" accept="image/*" id="id_Person_image">
    </div>

    <div class="form-row">
        <label class="required" for="id_Person_pwd">Password:</label><ul class="errorlist"><li>密碼</li></ul><input type="password" name="Person_pwd" required id="id_password1">
    </div>

{#    <div class="form-row">#}
{#        <label class="required" for="id_password2">Confirm Password:</label><ul class="errorlist"><li>再次輸入密碼</li></ul><input type="password" name="password2" required id="id_password2">#}
{#        </div>#}

  <div class="submit-row">
    <label>&nbsp;</label><input type="submit" value="註冊">
  </div>
</form>
</div>
        <br class="clear">
    </div>
    <!-- END Content -->
    <div id="footer"></div>
</div>
<!-- END Container -->
</body>
</html>


登錄註冊
在這裏插入圖片描述
查看控制檯
在這裏插入圖片描述
註冊成功
在這裏插入圖片描述
登錄django後臺管理界面查看person
在這裏插入圖片描述
臨時寫一個html查看註冊信息,ok沒bug
在這裏插入圖片描述
有個問題就是不美觀,這個很不好……
下一篇寫學習css與js的筆記,peace!!!

發佈了84 篇原創文章 · 獲贊 108 · 訪問量 7908
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章