P3 元宝第三天的笔记

案例:

实现登录注册功能。

注册:用户输入账号密码以后提交到服务器,服务器将账号密码保存到数据库中,然后重定向到登录页面。

登录:用户输入账号密码,服务器判断账号密码是否存在,如果存在的话登录成功转跳到主页面。

分析

需要3个页面、需要3个类视图(5个视图方法)。

注册类视图:

get视图方法:获取注册页面。

post视图方法:提交注册的账号密码,并且转跳到到登录页面。

登录类视图:

get视图方法:获取登录页面。

post视图方法:提交登录的账号密码,并且转跳到到主页面。

主页面类视图:

[表情] get视图方法:获取主页面。

1.django项目和应用创建命令

django-admin startproject 项目名
python manage.py startapp 子应用名
python manage.py runserver 运行项目

2.配置模板

在setting文件中配置模板

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    'myapp',  # 注册子应用
]
TEMPLATES = [   
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],# 模板配置
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',  # 使用mysql数据库
        'HOST': 'localhost',  # 主机
        'PORT': 3306,  # 端口
        'USER': 'root',  # 用户名
        'PASSWORD': 'root',  # 密码,根据自己的密码来
        'NAME': 'game',  # 数据库
    }
}

安装数据库

在与项目同名的init.py文件中添加以下代码

import pymysql
pymysql.install_as_MySQLdb()

编写模型类

在子应用的models.py文件中编写代码

from django.db import models

class Users(models.Model):
    user = models.CharField(max_length=20,verbose_name='用户名')
    pwd = models.CharField(max_length=20,verbose_name='密码')

迁移

生成迁移文件:python .\manage.py makemigrations
执行迁移:python .\manage.py migrate

视图

在子应用的views.py文件中编写视图代码,来处理业务逻辑

from django.shortcuts import render,redirect
from django.views import View
from django.http import HttpResponse
from myapp.models import Users
# Create your views here.

# 注册视图
class Register(View):
    # 返回注册页面
    def get(self,repuest):
        return render(repuest,'register.html')
    # 提交账号密码并保存的数据库
    def post(self,request):
        # 获取表单中的数据
        user1 = request.POST.get('user')
        pwd1 = request.POST.get('pwd')
        # 将账号密码保存的数据库中,可能出现异常,所以要进行异常处理
        try:
            Users.objects.create(user=user1,pwd=pwd1)
        except Exception as e:
            print(e)
            return HttpResponse('账号密码注册失败')
        # 重定向到登录页面
        return redirect('/login/')

# 登录视图
class Login(View):
    # 返回登录页面
    def get(self,request):
        return render(request,'login.html')
    # 提交账号密码,验证账号密码是否存在
    def post(self,request):
        user1 = request.POST.get('user')
        pwd1 = request.POST.get('pwd')
        # 查看数据库中是否存在账号为user1的数据
        try:
            # 查询
            user_data = Users.objects.get(user=user1)
        except Exception as e:
            print(e)
            return HttpResponse('账号密码不存在')
        # 用户存在,判断密码是否一致
        if pwd1 == user_data.pwd:
            # 重定向到主页面
            return redirect('/main/')
        else:
            return HttpResponse('密码错误')

# 主页面视图
class Main(View):
    # 获取主页面
    def get(self,request):
        return render(request,'main.html')

在templates文件下写与视图对应的模板页面

注册页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h3>注册页面</h3>
    <form method="post" action="/register/">
        {% csrf_token %}
        账号:<input type="text" name="user">
        密码:<input type="password" name="pwd">
        <input type="submit" value="提交">
    </form>
</body>
</html>

登录页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h3>登录页面</h3>
    <form method="post" action="/login/">
        {% csrf_token %}
        账号:<input type="text" name="user">
        密码:<input type="password" name="pwd">
        <input type="submit" value="登录">
    </form>
</body>
</html>

主页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h3>主页面</h3><br>
    <table width="800" border="1" style="margin: 0 auto;">
        <tr>
            <th>编号</th>
            <th>用户名</th>
        </tr>
        {% for i in show_user %}
            <tr>
                <th>{{ i.id }}</th>
                <th>{{ i.user }}</th>
            </tr>
        {% endfor %}
    </table>
    <br><br><br><br><br>
    <table width="800" border="1" style="margin: 0 auto;">
        <tr>
            <th>编号</th>
            <th>书名</th>
            <th>类型</th>
            <th>价格</th>
            <th>操作</th>
        </tr>
        {% for i in show_books %}
            <tr>
                <th>{{ i.id }}</th>
                <th>{{ i.name }}</th>
                <th>{{ i.kind }}</th>
                <th>{{ i.price }}</th>
            </tr>
        {% endfor %}
    </table>
</body>
</html>

路由

为了让视图生效,需要编写路由代码
我们可以采用路由分发,在创建的app中新建一个urls.py文件

from django.contrib import admin
from django.urls import path
from myapp import views

urlpatterns = [
    path('register/', views.Register.as_view()),
    path('login/', views.Login.as_view()),
    path('main/', views.Main.as_view()),
]

在与项目同名的urls.py

from django.contrib import admin
from django.urls import path,include
from myapp import urls

urlpatterns = [
    path('admin/', admin.site.urls),
    path('',include(urls))
]

静态路由(GET参数)

127.0.0.1:8000/article/?page=1

127.0.0.1:8000/article/?page=2

127.0.0.1:8000/article/?page=3

动态路由

127.0.0.1:8000/article/1/

127.0.0.1:8000/article/2/

127.0.0.1:8000/article/3/

上下两种的区别:

  • 动态路由传参,参数需要参与路由匹配,在路由匹配中获取参数
  • GET参数,参数部分不需要参与路由匹配,在视图中提取参数

动态路由案例:

# 路由配置
from django.urls import path,re_path
from users import views
urlpatterns = [
    # 动态路由
    path('article/<str:page>/', views.ArticleView),
    path('<int:x>/<str:y>/', views.Index),
    re_path(r'^(?P<aaa>\d+)/$', views.Index2)
]

# 视图代码
def ArticleView(request, page):
    print(type(page))
    return HttpResponse(f"这是第{page}页")

def Index(request, x, y):
    return HttpResponse(f"x:{x},y:{y}")

def Index2(request, aaa):
    return HttpResponse(f"正则表达式路由,aaa:{aaa}")

路由分发:

1.在子应用的文件夹下创建一个urls.py文件,将子路由的代码放在该文件中。

from django.urls import path,re_path
from users import views
# 子应用下的子路由
urlpatterns = [
    # 静态路由
    path('register/', views.RegisterView.as_view()),
    path('login/', views.LoginView.as_view()),
    path('index/', views.IndexView.as_view()),
    # 动态路由
    path('article/<str:page>/', views.ArticleView),
    path('<int:x>/<str:y>/', views.Index),
    re_path(r'^(?P<aaa>\d+)/$', views.Index2)
]

2.主路由进行路由分发。

from django.contrib import admin
from django.urls import path,include
# 导入子路由
from users import urls
# 主路由
urlpatterns = [
    path('admin/', admin.site.urls),
    # 路由分发
    path('', include(urls)),
]

删除操作

在view视图里

class DelBookView(View):
    def get(self,request,id):
        Books.objects.filter(id=id).delete()
        return redirect('/index/')

在模板页面里

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h3>主页面</h3><br>
    <table width="800" border="1" style="margin: 0 auto;">
        <tr>
            <th>编号</th>
            <th>用户名</th>
        </tr>
        {% for i in show_user %}
            <tr>
                <th>{{ i.id }}</th>
                <th>{{ i.user }}</th>
            </tr>
        {% endfor %}
    </table>
    <br><br><br><br><br>
    <table width="800" border="1" style="margin: 0 auto;">
        <tr>
            <th>编号</th>
            <th>书名</th>
            <th>类型</th>
            <th>价格</th>
            <th>操作</th>
        </tr>
        {% for i in show_books %}
            <tr>
                <th>{{ i.id }}</th>
                <th>{{ i.name }}</th>
                <th>{{ i.kind }}</th>
                <th>{{ i.price }}</th>
                # 删除
                <th><a href="/del/{{ i.id }}/" style="text-decoration: none">删除</a></th>
            </tr>
        {% endfor %}
    </table>
</body>
</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值