django3项目内View实现增删改查

1创建新项目的准备工作

1.1命令框内创建新项目

打开指定文件夹,在路径位置输入cmd打开命令行
django-admin startproject 项目名 创建项目

1.2在新项目内创建子应用

python manage.py startapp 子应用名

1.3注册子应用

在settings.py文件内注册子应用

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

    '创建的子应用名'    #注册子应用
]

1.4配置模板

在settings.py文件内配置模板

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',
            ],
        },
    },
]

1.5配置数据库

在settings.py文件内

# 配置数据库
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',  # 使用mysql数据库
        'HOST': 'localhost',  # 主机
        'PORT': 3306,  		# 端口
        'USER': 'root',  	# 数据库的用户名
        'PASSWORD': '密码', # 数据库的密码
        'NAME': '创建的数据库名',  	# 数据库的名字
    }
}

1.6修改语言和时区

在settings.py文件内

LANGUAGE_CODE = 'zh-Hans'  #语言

TIME_ZONE = 'Asia/Shanghai'  #时区

1.7配置静态文件

在settings.py文件内

# 配置静态资源(现在基本上用不到)
STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR,'static')]  #配置路径,在根目录创建文件夹

1.8常用的mysql代码语句

查看所有数据库: show databases;
创建数据库: create database 数据名 charset=utf8;
删除数据库: drop database 数据库名;
调用数据库: use 数据库名;
查看数据库下的所有表: show tables;
查看表结构: desc 表名;
查看表中的所有数据: select * from 表名;

1.9安装数据库

在跟项目名同名的文件夹内init.py文件里安装

import pymysql
pymysql.install_as_MySQLdb()

1.9.1创建模型类

在子应用文件夹里的models.py创建

# 模型类 会自动生成 id字段
class users(models.Model):
# CharField 字符串 max_length 最大长度 verbose_name 后台管理的字段名
    user=models.CharField(max_length=20,verbose_name="用户名")
    pwd=models.CharField(max_length=20,verbose_name='密码')
class games(models.Model):
    name=models.CharField(max_length=20,verbose_name='昵称')
    profession=models.CharField(max_length=20,verbose_name='职业')
    atk=models.IntegerField(verbose_name='攻击力')
    level=models.IntegerField(verbose_name='等级')
    

1.9.2创建好模型类后进行迁移

在项目内终端执行
生成迁移文件:python manage.py makemigrations
执行迁移:python manage.py migrate
如果迁移出错,把数据库删了创建新的数据库,生成的迁移文件也删了,重新执行上面2个步骤

1.9.3创建超级用户

创建超级用户 (python终端内运行)
python manage.py createsuperuser
电子邮件地址直接回车跳过
(前后密码要一致)
如果出现cryptography报错就python终端内安装
pip install cryptography

2.在子应用的admin.py文件中添加代码,注册表,不然admin控制台没办法管理这个表

from django.contrib import admin
#导包
from myapp.models import users,games  #models.py文件内创建的模型类名
# Register your models here.
admin.site.register(users)
admin.site.register(games)

3.运行项目,在admin页面添加数据

案例:实现登录注册功能。

注册:用户输入账号密码以后提交到服务器,服务器将账号密码保存到数据库中,然后重定向到登录页面。
登录:用户输入账号密码,服务器判断账号密码是否存在,如果存在的话登录成功转跳到主页面。

分析

需要3个页面、需要3个类视图(5个视图方法)。
注册类视图:
​ get视图方法:获取注册页面。
post视图方法:提交注册的账号密码,并且转跳到到登录页面。

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

主页面类视图:
get视图方法:获取主页面。

在根目录文件夹内创建三个html页面文件

这是将三个html文件写在一起了
注意看注释每个文件隔开了

{# 第一个注册页面register.html#}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{#    CSRF报错第一种解决方案#}
{#    注释中间件中与CSRF相关的中间件#}
{#    CSRF报错第二种解决方案#}
{#    {% csrf_token %}#}
    <h3>注册页面</h3>
    <form method="post">
        账号:<input type="text" name="user">
        密码:<input type="password" name="pwd">
        <input type="submit" value="提交">
    </form>
</body>
</html>
{#第二个登录页面login.html#}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
        <h3>登录页面</h3>
    <form method="post">
        账号:<input type="text" name="user">
        密码:<input type="password" name="pwd">
        <input type="submit" value="登录">
    </form>
</body>
</html>
{#第三个主页面 index.html#}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h3>主页面</h3>
    <table>
        <tr>
            <td>编号</td>
            <td>名字</td>
            <td>职业</td>
            <td>攻击力</td>
            <td>等级</td>
            <td>操作</td>
        </tr>
        {% for i in gamess %}
        <tr>
            <td>{{ i.id }}</td>
            <td>{{ i.name }}</td>
            <td>{{ i.profession }}</td>
            <td>{{ i.atk }}</td>
            <td>{{ i.level }}</td>
{#      删除数据      #}
            <td><a href="/del/{{ i.id }}/">删除</a></td>
        </tr>
        {% endfor %}
    </table>
{#  添加数据  #}
    <form method="post">
        名字 <input type="text" name="name">
        职业 <input type="text" name="profession">
        攻击 <input type="text" name="atk">
        等级 <input type="text" name="level">
        <input type="submit" value="添加">
    </form>
{#  修改数据  #}
    <p>根据id修改信息</p>
    <form method="post" action="/update/">
        编号 <input type="text" name="id">
        名字 <input type="text" name="name">
        职业 <input type="text" name="profession">
        攻击 <input type="text" name="atk">
        等级 <input type="text" name="level">
        <input type="submit" value="添加">
    </form>
{#  根据编号查询数据  #}
    <p>搜索</p>
    <form method="get" action="/search/">
        编号 <input type="text" name="id">

        <input type="submit" value="查询">
    </form>
</body>
</html>

在views.py文件内创建视图类

#导包
from django.shortcuts import render,redirect
from django.views import View
from django.http import HttpResponse
from myapp.models import users,games

#注册视图
class registerview(View):
    #返回注册页面
    def get(self,request):
        return render(request,'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 loginview(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('/index/')

        else:
            return HttpResponse('密码错误')
#主页面视图
class indexview(View):
		#获取主页面
    def get(self,request):
        games_data=games.objects.all()
        content={
            'gamess':games_data
        }
        return render(request,'index.html',content)
    def post(self,request):
    	#添加数据
        name1=request.POST.get('name')
        profession1=request.POST.get('profession')
        atk1=request.POST.get('atk')
        level1=request.POST.get('level')
        try:
            games.objects.create(name=name1,profession=profession1,atk=atk1,level=level1)
        except Exception as e:
            print(e)
            return HttpResponse('添加失败')
        return redirect('/index/')
##设置删除视图函数
class delgamesview(View):
    def get(self,request,id):
                            #id=路路由动态的id
        games.objects.filter(id=id).delete()
        return redirect('/index/')
        
#修改数据视图
class updategamesview(View):
    def post(self,request):
        id1=request.POST.get('id')
        name1=request.POST.get('name')
        profession1=request.POST.get('profession')
        atk1=request.POST.get('atk')
        level1=request.POST.get('level')
        try:
            games.objects.filter(id=id1).update(name=name1,profession=profession1,atk=atk1,level=level1)
        except Exception as e:
            print(e)
            return HttpResponse('修改失败,数据不存在')
        return redirect('/index/')

#查询功能
class searchgameview(View):
    def get(self,request):
        id = request.GET.get('id')
        print(id)
        try:
            game_data = games.objects.get(id=id)
        except Exception as e:
            print(e)
            return HttpResponse('查询失败')
        return HttpResponse(f'编号{game_data.id}姓名{game_data.name},职业{game_data.profession}攻击力{game_data.atk},等级{game_data.level}')

配置路由

#导包
from myapp import views
urlpatterns = [
    # path('admin/', admin.site.urls),
    path('register/',views.registerview.as_view()),
    path('login/',views.loginview.as_view()),
    path('index/',views.indexview.as_view()),
    #删除数据路由
    path('del/<int:id>/',views.delgamesview.as_view())
    #修改数据路由
    path('update/',views.updategamesview.as_view()),
    #查询数据路由
    path('search/',views.searchgameview.as_view())
    
]

第四单元知识点:

1.动态路由

views.py文件内创建视图类

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

class indexview2(View):
    def get(self,request,id):
        return HttpResponse(f'匹配到的参数为{id}')

class indexview3(View):
    def get(self,request,x,y):
        return HttpResponse(f'x为{x},y为{y}')

配置路由

#导包
from django.urls import path,re_path
urlpatterns = [
    # path('admin/', admin.site.urls),
    path('register/',views.registerview.as_view()),
    path('login/',views.loginview.as_view()),
    path('index/',views.indexview.as_view()),
    #正则表达式格式路径 上面要导包
    re_path(r'^[a-z]{5}/$',views.indexview.as_view()),

    #动态路由
                #指明数据类型
    path('index2/<int:id>/',views.indexview2.as_view()),
    re_path(r'^(?P<x>\d+)/(?P<y>[a-zA-Z]+)/$',views.indexview3.as_view())
]

2.路由分发

将主路由扽分发到子应用里
先在子应用里创建一个跟主路由同名的urls.py文件
然后将主路由里的文件复制到子应用里的urls.py中

# from django.contrib import admin
from django.urls import path,re_path

from myapp import views

urlpatterns = [
    # path('admin/', admin.site.urls),
    path('register/',views.registerview.as_view()),
    path('login/',views.loginview.as_view()),
    path('index/',views.indexview.as_view()),
    #正则表达式格式路径 上面要导包
    re_path(r'^[a-z]{5}/$',views.indexview.as_view()),

    #动态路由
                #指明数据类型
    path('index2/<int:id>/',views.indexview2.as_view()),
    re_path(r'^(?P<x>\d+)/(?P<y>[a-zA-Z]+)/$',views.indexview3.as_view())
]

在主路由里进行分发

from django.contrib import admin
#导包
from django.urls import path,include
from myapp import urls

#路由分发 全部分到子路由

urlpatterns = [
    path('admin/', admin.site.urls),
    path('',include(urls))
]
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值