栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

django复习笔记

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

django复习笔记

django复习 一、Django项目的创建和常用功能 1.1 创建django项目

步骤如下:

  • 下载django模块

    pip install Django
    
  • 在文件的命令提示符上创建django项目

    django-admin startproject 项目名称
    
  • 运行django项目–在编辑器的终端输入以下命令

    python manager.py runserver
    
1.2 创建项目的APP

一个项目所有的业务和页面展示通过app完成。在编辑器的终端输入以下命令

python manager.py startapp 应用程序的名称

项目中注册app,打开项目下的setting.py文件,把app名称加入进去

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'stuMangerApp'  # 创建的App名称

]
1.3 配置路由功能

配置网页的访问路径,一个具体的访问路径对应一个具体业务的处理功能类。

步骤如下:

  • 在app目录下创建一个类,并且继承View类型,然后在get/post方法里面写具体的业务

    class Menu(View):
        def get(self,request):
            return HttpResponse("i am menu page")
    
  • 在当前的app目录下创建一个子路由模块,并设置urlpatterns=[]属性

    from django.urls import path   # 导入path模块
    urlpatterns=[
        path('menu',Menu.as_view()),
        path('login',Login.as_view()),
        # 管理员、老师、学生各自的路由
        path('admin',AdminMenu.as_view()),
        path('student',StudentMenu.as_view(),name="stu"),
        path('teacher',TeacherMenu.as_view())
        ....
    ]
    
  • 配置url别名说明:

    name="stu"是当前url访问的别名,本来访问是127.0.0.1:8000/SM/student,但是在重定向可以是redirect('stu')或页面渲染为{ url 别名}}">别名访问。不管你的路径如何修改,别名都可以访问

  • 把子路由注册到项目的路由下面

    from django.contrib import admin
    from django.urls import path,include  #导入include模块
    from stuMangerApp import stu_manager_urls
    urlpatterns = [
        path('admin/', admin.site.urls),
        # 配置项目的父路由
        path('SM/',include(stu_manager_urls)) # 注册子路由
    ]
    

  • 运行项目进行访问,访问路径为

    http://127.0.0.1:8000/根路由/子路由名称
    
1.4 配置template目录

在当前项目的目录下,创建一个templates文件夹,里面用于存放html页面,然后在setting.py注册此目录

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        #=============把创建的目录加入进去========================
        'DIRS': ['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 配置静态目录

在项目下创建一个static目录,和templates目录平级,此目录用于存放静态资源,如js,img,css等等。然后在setting.py注册此目录

STATIC_URL = 'static/'
# 配置静态文件目录
STATICFILES_DIRS=(os.path.join(BASE_DIR,'static'),) # 逗号不能丢

1.6页面响应

在一个视图类中的get/post方法中,通过return xxx,把具体内容交给浏览器显示,常见的内容响应如下:

  • 响应字符串 HttpResponse

    from django.http import HttpResponse
    from django.views import View
    class Test(View):
        def get(self,request):
            return HttpResponse("hello world") //页面会直接显示helloworld
    
  • 响应json JsonResponse

    from django.http import JsonResponse
    from django.views import View
    class Test(View):
        def get(self,request):
            data={
                'name':'张三',
                'age':12
            }
            # 必须传入一个字典类型数据
            return JsonResponse(data) //页面会直接显示json数据
    
  • 渲染模板 通过render把templates目录下对应的html交给页面进行显示,同时可以设置对应数据。

    from django.shortcuts import render
    class Login(View):
        def get(self,request):
            data={
                'k1':value1,
                'k2':value2,
                .....
            }
            # data必须是一个字典,才能把数据传入给页面。
            return render(request,'login.html'[,data]) # [,data]给页面传递数据,不写也行
    
  • 重定向

    from django.shortcuts import redirect
    class Test(View):
        def get(self,request):
            # redirect(名称) 可以是配置的路由path,也可以是别名
            return redirect("/SM/menu")
    
1.7 模板语法

前面已经知道了通过render,可以把页面交给浏览器展示,同时可以设置数据,想要数据在页面显示必须满足模板语法的要求.假设数据如:

  • 数据如下:

    class Test(View):
        def get(self,request):
            data={
                'title':'render模板语法的使用',
                'love':['爬山','踢足球','打篮球'],
                'error':''
            }
            return render(request,'test.html',data)
    
  • 直接显示

     { key名称 }}直接显示render数据键对应的值 -->
     

    {{title}}

  • 条件判断

    {%if error%}  
    

    错误信息:{{error}}

    {%endif %}
  • 循环

      {%for item in love%}
    • {{item}}
    • {%endfor%}
  • 继承:{% extends 'base.html' %}这个是一个特殊的语法,如:我的main.html中已经有了一个导航栏功能,其它页面也想要显示,则可以通过继承的方式。通常和{% block 名称%}{% endblock %}配合使用,block是在main页面留一个空白,其他页面继承了,想要自定义其它功能,可以重写此block.

    main.html页面

    
    {% load static %}
    
    
        
        
        
        
        
        {% block title %}{% endblock %}
        {% block css %}{% endblock %}
    
    
    
    
    {% block content %}{% endblock %}
    {% block js %}{% endblock %}
    
    
    

    other.html

    
    {% extends 'base.html' %} 
    
    {% block content %}
    
        我是other页面
    
    {% endblock %}
    
二、创建表模型 2.1 创建模型

在app目录下的models.py文件下,创建和表相关的模型类, 如:分别创建了老师、学生、分数模型,xxxField表示表字段的数据类型

from django.contrib.auth.models import User
from django.db import models

# Create your models here.
#==========Teacher=================
class Teacher(models.Model):
    real_name=models.CharField(verbose_name="真实姓名",max_length=64,default="无")
    subject=models.CharField(verbose_name="授课名称",max_length=64,default="无")
    user=models.OneToOneField(to=User,on_delete=models.SET_NULL,blank=True,null=True)
#=========Student=================
class Student(models.Model):
    real_name = models.CharField(verbose_name="真实姓名", max_length=64, default="无")
    group = models.CharField(verbose_name="班级",max_length=10,default="无")
    year = models.CharField(verbose_name="出生年份",max_length=16,default="无")
    month = models.CharField(verbose_name="出生月份",max_length=16,default="无")
    day = models.CharField(verbose_name="出生日期",max_length=16,  default="无")
    user = models.OneToOneField(to=User, on_delete=models.SET_NULL, blank=True, null=True)
#============Score==================
class Score(models.Model):
    subject_name=models.CharField(max_length=16)  # 教的学科名
    score=models.IntegerField(default=0)  # 分数
    group=models.CharField(max_length=16) # 班级
    # 设置对应学生表的外键
    student=models.ForeignKey(Student,on_delete=models.SET_NULL,blank=True,null=True)
2.2 表和表的关系
  • OneToOneField:一对一,如每个老师/学生都有一个账号,每个账号只能属于某个老师或学生。

    class Teacher(models.Model):
        ...
        user=models.OneToOneField(to=User,on_delete=models.SET_NULL,blank=True,null=True)
    class Student(models.Model):
        ...
        user = models.OneToOneField(to=User, on_delete=models.SET_NULL, blank=True, null=True)
    

    on_delete表示如果删除了老师获取学生的账号,那么老师表或学生表关于账号信息的对应字段设置为null

  • ForeignKey:即设置表模型的外键,可实现一对多.如一个学生有多门课程的分数保存在Score表模型中

    class Score(models.Model):
        subject_name=models.CharField(max_length=16)  # 教的学科名
       	...
        # 设置对应学生表的外键
        student=models.ForeignKey(Student,on_delete=models.SET_NULL,blank=True,null=True)
    
  • ManyToManyField:多对多

2.3 系统默认模型User

前面的模型外键关联了User类,这个类其实就是django自带的表模型,里面有username和password字段。导入默认模型如下:

from django.contrib.auth.models import User

此模型还带了许多关于数据验证的功能.

from django.contrib.auth import authenticate, login,logout
# 验证账号和密码是否正确 如果正确返回User对象否则为None,一般用于数据验证
user=authenticate(username=username,password=password)
# 用户登录成功,直接把数据存储到session里面,浏览器存储cookie
login(request,user)
#用户退出登录,直接清除session
logout(request)
2.4 创建超级用户

如果想要在这个表里面创建超级用户,表示管理员,则在项目下的终端输入以下命令:

python manager.py createsuperuser
2.5 迁移模型表到到数据库

模型已经创建好了,如果想要在数据库中生成对应的表,则在项目下的终端输入以下命令:

python manage.py makemigrations
python manage.py migrate

注意:如果修改了表模型的字段,则必须重新输入以上命令。否则出现field cannot find

三、表单内容 3.1提交方式

提交方式有get和post,在视图类中不同的提交方式对应具体的方法.

'''登录视图'''
class Login(View):
    def get(self,request):
        ....
        return HttpResponse("get提交...")
    def post(self,request):
        ...
        return HttpResponse("post提交...")
3.2数据获取
  • get数据获取 request.GET.get('表单提交的name值')

    class Login(View):
        def get(self,request):
            username=request.GET.get('username')
            password=request.GET.get('password')
            return HttpResponse("get提交...")
    
  • post数据获取 ,页面和视图类设置如下:request.POST.get('表单提交的name值')

     
    {% csrf_token %} ...
    class Login(View):
        def get(self,request):
            username=request.POST.get('username')
            password=request.POST.get('password')
            return HttpResponse("get提交...")
    

    post数据提交必须设置{% csrf_token %}

3.2 错误信息获取

使用render渲染模板,在方法参数里面可以传递一个字典对象,页面使用{{error}},输出错误

from django.contrib.auth import authenticate, login,logout
from django.contrib.auth.models import User
'''登录视图'''
class Login(View):
    def get(self,request):
        return render(request,'login.html')
    def post(self,request):
        #获取用户post提交过来的数据
        username=request.POST.get("username")
        password=request.POST.get("password")
        data={'error':''}
        #检查用户表里是否存在此用户名
        if User.objects.filter(username=username):
            # 判断用户和密码是否正确
            user=authenticate(username=username,password=password)
            # 判断是否超级用户
            if user and user.is_superuser:
                login(request,user)
                # return HttpResponse("登录成功")
                return redirect('/SM/admin')
            else:
                data['error'] = '不是超级管理员账号'
                return render(request, 'login.html', data)
        else:
            data['error']='没有此用户'
            return render(request, 'login.html',data)
四、MVT架构说明
  • M: 模型层,完成与数据的交互 对应models.py.一个模型对应一个数据库中的表。表的关系也可以清晰体现

  • V:视图层,一个视图类对应一个url请求对应views.py

  • T:完成HTMl文件的渲染对应templates目录

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/925476.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号