实现通过表单提交数据到数据库,模拟账号注册和登录
项目结构:
1:在templates/polls目录下创建登陆页面的html文件,这里的文件名为:login.html,内容为:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>login</title>
</head>
<body>
<h1>表单提交测试</h1>
<form method="post" action="{% url 'polls:loginsuccess' %}">
{% csrf_token %}
<input type="text" name="username" placeholder="用户名"/><br>
<input type="password" name="password" placeholder="密码"><br>
<input type="submit" value="注册/登录">
</form>
</body>
</html>
2:在views.py文件中创建函数用于返回这个页面:
def crt_login(request):
return render(request, 'polls/login.html')
3:在polls/urls.py文件中写入路径:
app_name = 'polls'
urlpatterns = [
path('', views.IndexView.as_view(), name='index'),
# ex: /polls/5/
path('download/<int:pk>/', views.DetailView.as_view(), name='detail'),
# ex: /polls/5/results/
path('<int:pk>/results/', views.ResultsView.as_view(), name='results'),
# ex: /polls/5/vote/
path('<int:question_id>/vote/', views.vote, name='vote'),
# script 1
path('script/', views.script, name='script'),
# crt user page
path('login/', views.crt_login, name='login'),
# login success page
path('success/', views.login_test, name='loginsuccess')
]
4:在主页面生成链接:
<a href="{% url 'polls:login' %}">take me to the login page</a>
到这里就完成了登陆页面的创建,如图所示:
5:创建登陆账号成功时候跳转的网页:
文件名为loginsuccess.html,第一步中的action内即为它的链接,路径的添加如第三步最后一行所示:
内容为:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>login success</title>
</head>
<body>
<h1 style="color:cyan">{{ name }}登录成功</h1>
</body>
</html>
6:创建处理数据的函数:
在这一步之前需要在数据库中创建相应的表:
在models.py文件中输入:
class UserData(models.Model):
nid = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
password = models.CharField(max_length=32,)
def __str__(self):
return self.name
然后在manage.py同级目录下执行
python manage.py makemigrations
python manage.py migrate
将数据改动迁移到数据库中,
在views.py文件内写入函数:
def login_test(request):
print('注册中')
# 获取页面传输来的数据
name = request.POST.get('username')
password = request.POST.get('password')
print('用户名:', name, '密码:', password,)
# 获取当前数据库中的账号信息
curr_data = UserData.objects.all()
user_data_dict = {}
# 将数据库中的信息整理进入字典方便查找对比
for user in curr_data:
user_data_dict[f'{user.name}'] = user.password
# 如果name已经存在,根据密码是否正确来决定返回数据
if name in user_data_dict.keys():
if password != user_data_dict[f'{name}']:
pass
return HttpResponse('密码错误请重新输入密码')
else:
return render(request, 'polls/loginsuccess.html', {'name': name})
# name不存在,创建新的账号
else:
db_data = UserData(name=name, password=password)
db_data.save()
return HttpResponse(f'{name}账号注册成功')
完成结果如图所示:
数据库:
密码错误:
登录成功:
注册成功:
数据库改动