django复习笔记

django复习

一、Django项目的创建和常用功能

1.1 创建django项目

步骤如下:

  • 下载django模块

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

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

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

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

python manage.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')或页面渲染为<a href="{{ url 别名}}">别名访问</a>。不管你的路径如何修改,别名都可以访问

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

    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数据键对应的值 -->
     <p>{{title}}</p>
    
  • 条件判断

    {%if error%}  <!-- 如果信息存在则显示-->
    <p>错误信息:{{error}}</p>
    {%endif %}
    
  • 循环

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

    main.html页面

    <!DOCTYPE html>
    {% load static %}
    <html lang="zh">
    <head>
        <meta charset="UTF-8">
        <link rel="stylesheet" href="/static/bootstrap/css/bootstrap.css">
        <script src="/static/js/jquery-3.5.1.min.js"></script>
        <script src="/static/js/echarts.js"></script>
        <script src="/static/bootstrap/js/bootstrap.js"></script>
        <title>{% block title %}{% endblock %}</title>
        {% block css %}{% endblock %}
    
    </head>
    <body>
    <nav>.........我是导航栏.............</nav>
    {% block content %}{% endblock %}
    {% block js %}{% endblock %}
    </body>
    </html>
    

    other.html

    <!--==============直接继承main.html============ -->
    {% extends 'base.html' %} 
    <!-- 我的页面已经包含main页面的全部功能了,如果想要在增加,则重写block块--->
    {% block content %}
    <h3>
        我是other页面
    </h3>
    {% 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自带的表模型,里面有usernamepassword字段。导入默认模型如下:

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 manage.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值')

     <form method="post" class="form">
        {% csrf_token %}
         ...
    </form>
    
    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目录

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
在学习Django时,使用PyCharm作为开发工具可以提高效率。PyCharm是一款功能强大的Python集成开发环境,它提供了丰富的功能和工具,可以帮助开发者更好地编写和调试Django应用程序。 在学习Django的过程中,可以使用PyCharm创建Django项目,并使用其内置的Django支持功能来简化开发过程。PyCharm可以自动识别Django项目的结构,并提供代码补全、语法检查、调试等功能,帮助开发者更快地编写和调试代码。 此外,PyCharm还提供了集成的版本控制系统,如Git,可以方便地管理和追踪代码的变化。它还支持自动化测试和部署,可以帮助开发者更好地进行项目管理和发布。 总之,使用PyCharm作为开发工具可以提高Django学习的效率和便利性。它的强大功能和友好的用户界面使得开发者可以更专注于代码的编写和项目的开发。\[1\] \[2\] \[3\] #### 引用[.reference_title] - *1* *3* [PyCharm平台下初学Django框架](https://blog.csdn.net/howard2005/article/details/93491364)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [pycharm平台下的Django教程](https://blog.csdn.net/Sunshine_ZCC/article/details/73918408)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值