经过了安装和部署操作后,我们在127.0.0.1:8000/admin的登录界面输入账号和密码,发现此时需要账号和密码才能进入。
解决方案:创建一个超级管理员的账号 python manage.py createsuperuser 邮箱格式符合即可
接着在输入界面,输入刚刚创建的账号和密码,之后就可以成功登陆。
以下界面就是django的后台管理界面。
理论流程
如何创建自己的页面呢?
终端输入: python manage.py startapp polls执行命令后相应新建polls应用文件,同时也会新增默认的py文件。
在url输入127.0.0.1:8000/polls/
在mydemo项目里的settings.py 中全局搜索APP,增加配置'polls'
路由
URLs得到浏览器请求的url后,对照路由表,然后分配到子路由或者转到功能函数,可以认为它是个导航系统。
配置路由
- 从之前的目录解释中,我们可以知道
项目orapp应用路由信息保存在相对应的urls.py文件中。 - 主路由:项目对应的
urls.py,所有的 url 都先发到这里来做对照,再分发给对应的子路由,也就是每个应用的路由。 - 在我们的项目中,主路由为
mydemo/urls.py,子路由为polls/urls.py。
配置主路由mydemo.urls.py
观察思考,下面代码对应的是admin页面的路由配置,那么我们要怎么在urlpatterns路由表中添加新的子路由来对新建页面进行展示呢?
原主路由配置
from django.contrib import admin
from django.urls import path
urlpatterns = [ path('admin/', admin.site.urls), ] # path()用于匹配路由
模仿主路由配置进行添加修改,逻辑上是这样 But... [admin是自带的]
from django.contrib import admin
from django.urls import path
urlpatterns = [ path('admin/', admin.site.urls), path('polls/', polls.urls), ]
# 配置有配置的要求
from django.contrib import admin
from django.urls import path
from django.urls import include # 需要通过导入include来分发路由
urlpatterns = [
path('admin/', admin.site.urls),
path('polls/', include('polls.urls')), # include()用来分发个子路由,参数是子路由的文件名,这里是字符串传输,555
]
子路由 polls.urls.py
- 创建
polls.urls.py - 用
app_name = 'polls'来设置命名空间,避免和其他应用的同名 url 混淆 - 编写路由表:
path()负责绑定业务功能
在自建的路由文件,导入path来匹配url
from django.urls import path # 导入当前目录下的views
from . import views # 确定命名空间
app_name = 'polls' # 子路由表
urlpatterns = [
path('', views.Login_view, name ='Login_view'), # path()负责绑定业务功能
]
视图
polls下创建view
- 一个视图函数(类),简称视图,是一个简单的
Python函数(类),它接受Web请求并且返回Web响应。这里的响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片。 - 无论视图本身包含什么逻辑,都要返回响应。代码写在哪里也无所谓,只要它在你当前项目目录下面。除此之外没有更多的要求了——可以说“没有什么神奇的地方”。为了将代码放在某处,大家约定成俗将视图放置在
项目(project)或应用程序(app)目录中的名为views.py的文件中。
创建视图
from django.shortcuts import render
# Create your views here
# 进入登录界面
def Login_view(request):
return render(request,'Login.html')
这时,就差最后一步,展示工作啦!
创建配置模板和html
首先我们先查看一下mydemo项目里的settings.py 全局搜索 TEMPLATES
# 未修改
'DIRS': [], # 这里通过配置路径进行创建和使用
# 进行配置
'DIRS': [os.path.join(BASE_DIR, 'templates')], # 通过字符串的拼接BASE_DIR表示项目所在目录+'目标文件名'配置目标路径
在polls下新建templates文件夹_(用于存放以后写的页面)_
在templates新建Login.html(解决对应前面页面不存在的问题)
简单的写下页面。能看到页面,说明配置成功啦。
模型
这里因为想实战数据库,写一个简单的交互页面Login.html (用户输入数据,我们进行存储)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>用户登录</title>
</head>
<body>
<form action="/polls/main" method="get">
<p><label>用户名:</label><input name="user"/></p>
<p><label>密码:</label><input name="pwd"/></p>
<input type="submit" value="提交"/>
</form>
</body>
</html>
提出功能:点击提交后获取用户输入的用户名和密码,去比对数据库表中的用户名和密码,将返回结果返回在新页面上。
一步步来
1.跳转到新页面polls/index/
注意:要加index后要加斜杠!
<form action="/polls/index/" method="get">
2.配置子路由
在子路由表(polls.urls) 增加子路由:
path('index/', views.toLogin_view, name='toLogin_view'),
在视图(polls.views) 增加功能:
# 进入判断是否登录陈宫界面
def toLogin_view(request):
# 获取账号密码
u = request.GET.get('user', '')
p = request.GET.get('pwd', '')
if u == p:
return HttpResponse('登录成功')
else:
return HttpResponse('登录失败')
启动服务,查看一下页面。
# 细化指定root用户登录
u=="root" and p=="123"
3.区别GET and POST
修改为POST:
Login.html : <form action="/polls/index/" method="post">
polls/views :
u = request.POST.get('user', '')
p = request.POST.get('pwd', '')
问题:django自带的安全机制。解决:增加标签在login.html的form.. method后:
{% csrf_token %}
说明:在setting.py全局搜csrf。第一种解决方案↑,也可以直接注释setting的那一行。
4.连接数据库
目的:在数据库中创建表,映射(自动生成)在model.py的数据模型
创建表名为:Logintable 属性字段为user pwd(都不能为空)
创建完成之后,在终端输入python manage.py inspectdb>polls/models.py
解释:将数据库内的表映射到polls/models.py (项目名称/数据模型),执行后再看model.py发现就不是空的啦,之后我们查看一下我们刚刚创建的Logintable在model中的描述。
这里要记得是objects有s!!
先做验证数据库中是否有用户数据(之前需要进行数据填充root,123)
view.py:
if u and p:
c = Logintable.objects.filter(user= u, pwd= p).count()
if c >=1:
return HttpResponse('登录成功')
else:
return HttpResponse('登录失败')
else:
return HttpResponse('重新输入')
Logintable.objects.filter()对数据进行查询,filter查询多个数据 .get是查询某一个数据。
对记录进行存储到数据库中(navicat查看的时候右键刷新),以下两种写法都可以。
if u and p:
c = Logintable(user= u,pwd= p)
c.save()
return HttpResponse('已导入数据库')
else:
return HttpResponse('重新输入')
if u and p:
c = Logintable()
c.user = u
c.pwd = p
c.save()
return HttpResponse('已导入数据库')
else:
return HttpResponse('重新输入')
读入数据,并存储在数据库当中啦。右击表进行刷新,对应刷新表的内容。