表單類
用戶登陸框
可以用純粹的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> </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> </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!!!