Pycharm-Django+mysql

593 阅读5分钟

经过了安装和部署操作后,我们在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

  1. 创建 polls.urls.py
  2. app_name = 'polls' 来设置命名空间,避免和其他应用的同名 url 混淆
  3. 编写路由表: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.htmlform.. 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发现就不是空的啦,之后我们查看一下我们刚刚创建的Logintablemodel中的描述。

这里要记得是objectss!!

先做验证数据库中是否有用户数据(之前需要进行数据填充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('重新输入')

读入数据,并存储在数据库当中啦。右击表进行刷新,对应刷新表的内容。

总结