Django:创建可访问网站的基本流程

版本:2.1.1

以下笔记记录了把Django三大基础模块运行起来的步骤。

1 创建项目:django-admin startproject myweb

    新增应用:python manage.py startapp appname 在当前主目录中新增名为myApp的应用模块
2 myApp目录:1)admin.py:站点配置; 2)models.py:模型; 3)views.py:试图
3 应用生效前需要激活:在setting.py中将myApp应用加入到INSTALLED_APPS中;
4 settings.py文件:修改网页为中文:修改LANGUAGE_CODE = 'zh-hans'
    修改网站时区:TIME_ZONE = 'Asia/Shanghai'
    修改数据库配置:DATABASES = {
                    'default':{
                        'ENGINE' : 'django.db.backends.mysql',
                        'NAME': 'sunck',
                        'USER': 'root',
                        'PASSWORD': 'root',
                        'HOST': 'localhost',
                        'PORT': '3306',
                    }
                }
5 导入MySQL操作模块:在主项目的__init__.py中:
    import pymysql
    pymysql.install_as_MySQLdb()
    如果使用其他第三方MySQL库,与此类似。如果使用sqlite则不需要导入,因为Django内置了对sqlite的支持。
6 模型:
    --->定义模型:一个数据表对应一个模型类。在appname的models.py中定义模型。
    --->创建模型:模型类继承于django.db.models.Model。数据列的类型在django.db.models中定义,如CharField(),一般以Filed结尾的对象。如果类成员变量中没有指定主键,那么在生成迁移文件时,会自动加一个自增主键。
    --->生成迁移文件:python manage.py makemigrations,在migration目录下生成一个迁移文件,用于描述数据表,但还未生成数据表
    --->生成数据表:python manage.py migrate,在数据库中生成数据表。生成的数据表名是'appname_modelclass'格式的,如myapp_grades
    --->测试数据操作:可以直接在Python shell中进行测试。
        --->执行python manage.py shell,进入shell
        --->引入模型包:from myApp.models import Grades,Students
        --->引入模型类数据赋值用到的包,如datetime等
        --->查询所有数据:Grades.objects.all(),返回Grades对应的myapp_grades表中的所有数据
        --->添加数据:
            --->创建一个模型类的对象实例,给实例添加和类属性同名的实例属性并赋值
                grade = Grades()
                grade.gname = '初一'
            --->保存数据:grade.save()
            说明:Django框架可以把实例属性的值映射到类属性中,从而生成正确的SQL语句。如果没有给实例添加类属性同名的属性,则生成SQL语句时,如果该列不能为空,则会报错。
            说明:重写模型类的__str__函数,返回的字符串会在python shell中查询时显示。
        --->查询某个数据:grade = Grades.objects.get(pk=1),查询主键(id列)是1的结果,返回的数据会填充Grades对象grade的实例属性
        --->修改某个数据:查询出对象后,修改对象的实例属性,再次调用save(),可以进行数据库中的数据内容修改
        --->删除某个数据:查询出对象后,调用对象的delete()就可以删除数据库中的数据行,如grade.delete()
        --->关联对象:Grades和Students两个表有关联,Students.sgrade列的外键是Grades的主键。测试如下:
            --->关联两个对象:student.sgrade = grade;student.save(),数据库中该行数据的外键就是grade对象的主键
            --->获取关联的所有对象:grade.students_set.all(),返回所有关联了grade的student对象,关联函数格式:关联模型类名小写_set
            --->创建关联的对象:student2 = grade.students_set.create(sname='小明'),参数需要用命名参数的方式,传入关联模型的类属性为名的参数列表,不用传入外键的值,外键的值会自动赋值为grade对象的主键,执行结果是在myapp_students表中添加一行数据,该数据的外键是grade对象的主键。
        --->启动服务器进行测试:python manage.py runserver ip:port,如果不写ip和':',就是本地,如果不写端口,就是8000
            这是一个python实现的轻量级web服务器,只能在测试中使用
7 admin站点管理应用:即settings.py的INSTALLED_APPS中的'django.contrib.admin'
    功能:内容发布:负责添加、修改、删除内容(数据)
    创建网站管理员:python manage.py createsuperuser
    添加可管理的数据表:在某个应用的admin.py文件中添加,如myApp下:
        admin.site.register(Grades)
        admin.site.register(Students)
        如上可以在管理页面添加对两个数据表的操作
    自定义管理页面:默认的管理页面数据不是按行显示,可以自定义显示页面。自定义管理页面需要继续Django的管理页类,然后进行属性修改
        --->在admin.py中添加定义自定义管理类:class GradesAdmin(admin.ModelAdmin)
        --->修改添加数据表的语句为:admin.site.register(Grades, GradesAdmin)
        --->修改列表页属性:数据类型:list        
            --->list_display = ['pk', 'gname', 'gdate'],显示数据表格头,名称必须和数据表的列名相同,可以只显示部分表头,主键未自定义的可以用'pk'表示
            --->list_fliter = ['gname'],在页面添加过滤器,可以过滤字段
            --->search_fields = ['gname'],增加一个搜索框,可以按哪些列进行搜索
            --->list_per_page = 10,设置每页显示多少条结果
        --->修改添加页属性:数据类型:list
            --->fields = ['gdate', 'gname', 'ggrilnum', 'gboynum'],配置修改页面中各列的显示顺序,主键不能修改,所以这里不能添加主键列;
            --->fieldsets = [('num', {'fields':['ggrilnum', 'gboynum']}),('base', {'fields': ['gname', 'gdate']}),],对修改页的各列进行分组显示,'num'是分组名称,'fields'是
            说明:修改页的两个属性不能同时配置
        --->关联对象:在添加数据页面,新增关联对象的添加表格,使得在创建一个主数据时,添加多个关联的数据
            --->首先申明关联对象类:class StudentsInfo(admin.TabularInline):
                关联对象表格TabularInline按行显示,StackedInline按列显示
                --->设置属性:model = Students #表示关联类的模型类
                              extra = 数字 #表示默认添加几条表格
            --->然后在管理页GradesAdmin中添加关联对象类属性:inlines = [StudentsInfo]
            这样,当添加Grades时,添加页面就会显示关联的Students类的表格
        --->修改布尔值(其他值类似):在GradesAdmin中定义一个成员函数,函数返回转换后的值字符串,然后把list_display中对应被转换值的列名改为前面定义的函数名,框架就会调用该函数转换值字符串
        --->修改表头名:上一步的转换函数定义好后,为转换函数添加属性:short_description = '新列名',就可以修改对应转换列的名称。这种方法不能用于修改页面和查找过滤的名称替换。
        --->修改“执行动作”控件的位置:页面类StudentsAdmin的属性actions_on_top=True,在页面上方显示,actions_on_bottom=True,在页面下方显示,False就是不显示
        --->用装饰器替换注册语句:即在页面类定义前加@admin.register(Students)来替换admin.site.register(Students, StudentsAdmin)
8 视图:在Django中,视图对web请求进行回应,MTV中的V,类似于MVC中的C。负责具体的业务逻辑,每个视图和每个页面对应,每个视图就是一个处理函数。
    --->在主目录的主项目下的urls.py中添加url地址及对应的响应视图
    --->如果子项目响应url地址,步骤如下:
        --->在主项目的urlts.py中,urlpatterns中添加正则化的url表达式和对应的子项目urls文件:path(r'', include('myApp.urls')),添加myApp下的urls文件来响应所有的url请求
        --->在子项目的views.py中实现视图函数:
            def detail(request, *args):
                output = 'detail';
                for i in range(len(args)):
                    output += '-%s' % args[i]
                return HttpResponse(output)
            HTTPResponse是django.http中的类,可以用来返回网页,这里直接返回了一个字符串
        --->在子项目的urls.py中,导入视图模块(视图函数),在urlpatterns中添加具体的url正则表达式和对应的视图:url(r'^(\d+)/(\d+)/$', view = detail),用detail函数来处理形如'/数字/数字'的url地址
9 模板:模板是HTML页面,可以根据视图传过来的数据填充控件。模板的创建步骤如下:
    --->创建模板目录:在主目录下创建templates目录,在目录下创建对应项目的模板目录,如./mysite/是主目录,./mysite/mysite/是主项目目录,./mysite/myApp/是子项目目录,则模板目录是./mysite/templates/myApp/
    --->配置模板目录:在主项目的settings.py中,修改TEMPLATES参数的DIRS属性为:'DIRS': [os.path.join(BASE_DIR,'templates')],
    --->定义模板:在项目模板目录中,添加html文件。模板语法:'{{输出值或变量或对象.属性}}','{%执行模板专用语句%}',''中的就是在模板中预留填充的语法。
    --->填充模板数据:定义响应的url和视图,在视图函数中给模板填充数据并渲染,把渲染好的页面返回到浏览器。
        --->模板中:for/endfor是模板专用语句中的循环语句
            <ul>
            {%for grade in grades%}
            <li>
                <a href="{{grade.id}}">{{grade.gname}}</a>
            </li>
            {%endfor%}
            </ul>
            模板是未经渲染的html文本,所以可以把'{{}}'放在字符串的引号中,比如上面的超链接
        --->views.py中:
            def show_grades(request, *args):
                gradesList = Grades.objects.all() #获取所有的年级列表
                return render(request, 'myApp/grades.html', {'grades': gradesList}); #render函数用来渲染页面,第二个参数是模板路径,配置文件中已经配置了模板目录,这里只需要相对路径,第三个参数就是传递的数据,在html中的变量名是‘grades’,需要用dict传递数据
        --->urls.py中: url(r'^grades/(\d+)/$', view = show_students_of_grade),正则url中的括号内匹配到的数据,会当做视图函数的入参,分组顺序传入视图函数
            
    --->在网页中打开localhost:8000/grades就可以看到返回的结果
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值