初学Django(二)之路由,视图和数据库操作

一.上节的回顾:

[上一节笔记](https://blog.csdn.net/qq_33316576/article/details/79697769)
上一节我主要学了Django的创建工程和app,并且对工程和app目录下的各个文件的作用进行了了解.
此外,我还了解了Django对一个请求的最为本质的处理过程:请求->url(寻找对应的视图函数或者类)->视图(执行相
关处理,返回字符串给客户端)->客户端接受字符串,并为用户呈现在页面上. 

二.路由系统(URL)

URL配置(URLconf)就像Django 所支撑网站的目录。它的本质是URL与要为该URL调用的视图函数之间的映射表。
你就是以这种方式告诉Django,对于这个URL调用这段代码,对于那个URL调用那段代码。

1.路由有两种对应视图的方式

        url(r'^index/', views.index)     //对应视图函数index()
        url(r'^home/', views.Home.as_view())     //对应视图类Home
        from django.views import View
        class Home(View)
            def get(self, request)
                //get请求执行该函数
            def post(self, request)
                //post请求执行该函数.

            //默认下执行dispath函数.

2.通过路由给视图传参数

    url(r'^detail-(\d+).html', views.detail)     //括号内的正则表达式为参数,这就表示给视图函数index()传递一个整数参数.
    url(r'^detail-(?P<nid>\d+).html', views.detail)     //这就表示给变量nid赋一个整数值,然后将其传递给index().

实战:

    实战:
        a. 
            url(r'^detail-(\d+)-(\d+).html', views.detail),

            def func(request, nid, uid):

                pass

            def func(request, *args):
                args = (2,9)


            def func(request, *args, **kwargs):
                args = (2,9)

        b. 
            url(r'^detail-(?P<nid>\d+)-(?P<uid>\d+).html', views.detail)

            def func(request, nid, uid):
                pass

            def funct(request, **kwargs):
                kwargs = {'nid': 1, 'uid': 3}

            def func(request, *args, **kwargs):
                args = (2,9)

3.name(对路由关系进行命名, 以后可以根据此名称生成自己想要的URL)

url(r'^asdfasdfasdf/', views.index, name='i1')   name代指的是固定的url(asdfasdfasdf/)
url(r'^yug/(\d+)/(\d+)/', views.index, name='i2')
url(r'^buy/(?P<pid>\d+)/(?P<nid>\d+)/', views.index, name='i3')

reverse函数能根据路由关系的名字和传递的参数自动生成url.
    def func(request, *args, **kwargs):
        from django.urls import reverse

        # 当前的URL
        # request.path_info 

        url1 = reverse('i1')                              # asdfasdfasdf/
        url2 = reverse('i2', args=(1,2,))                 # yug/1/2/
        url3 = reverse('i3', kwargs={'pid': 1, "nid": 9}) # buy/1/9/

xxx.html

        {% url "i1" %}               # asdfasdfasdf/
        {% url "i2" 1 2 %}           # yug/1/2/
        {% url "i3" pid=1 nid=9 %}   # buy/1/9/

4.多级路由:

Django可以将整个工程的路由关系分发给app的路由系统中,消除两个至多个app使用相同的路由关系造成的冲突.
    project/urls.py
        from django.conf.urls import url,include
        from django.contrib import admin
        //路由的分发
        urlpatterns = [
            url(r'^cmdb/', include("app01.urls")),
            url(r'^monitor/', include("app02.urls")),
        ]

    app01/urls.py
        from django.conf.urls import url,include
        from django.contrib import admin
        from app01 import views

        urlpatterns = [
            url(r'^login/', views.login),
        ]

    app02/urls.py
        from django.conf.urls import url,include
        from django.contrib import admin
        from app02 import views

        urlpatterns = [
            url(r'^login/', views.login),
        ]

5.其他知识:略

三.视图(view)

(个人目前的想法)django的视图用来处理客户端发来请求中的数据,然后将其变成字符串后返回给客户端。

1.获取用户请求数据

    request.GET  //获取get请求的数据
    request.POST  //获取post请求的数据
    request.FILES //获取文件内容
    request.POST.getlist()   //获取checkbox等多选的内容

2.上传文件

    # 上传文件,form标签做特殊设置,form标签中要添加"enctype='multipart/form-data'",
    添加以后,如果表单提交的是字符串,则可由'POST'提取,如果表单提交的是文件,则可由'FILES'提取.
    obj = request.FILES.get('fafafa')
    obj.name
    f = open(obj.name, mode='wb')
    for item in obj.chunks():
        f.write(item)
    f.close()

五.html模板

1.字典的循环
{{% for i in dict.keys %}}   //取key
{{% for i in dict.values %}}  //取value
{{% for item in dict.items %}}   //取key和value
{{% for key,value in dict.keys %}}

六.ORM操作

1.创建类

a.先写类
    from django.db import models

    # app01_userinfo,数据库中的表名(app名称+类名)
    class UserInfo(models.Model):
        # id列,自增,主键
        # 用户名列,字符串类型,指定长度
        username = models.CharField(max_length=32)
        password = models.CharField(max_length=64)

b. 注册APP

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

c. 执行命令
    python manage.py  makemigrations
    python manage.py  migrate

d. ********** 注意 ***********
    Django默认使用MySQLdb模块链接MySQL
    主动修改为pymysql,在project同名文件夹下的__init__文件中添加如下代码即可:
        import pymysql
        pymysql.install_as_MySQLdb()

2.常用字段类型

字段:
        字符串类型
        数字
        时间
        二进制
        自增(primary_key=True) //Mysql表里只能有一个自增列

字段的参数:
        null               -> db是否可以为空
        default            -> 默认值
        primary_key        -> 主键
        db_column          -> 列名
        db_index           -> 索引
        unique             -> 唯一索引
        unique_for_date    -> 
        unique_for_month
        unique_for_year
        auto_now           -> 创建时,自动生成时间
        auto_now_add       -> 更新时,自动更新为当前时间

            # obj = UserGroup.objects.filter(id=1).update(caption='CEO')  //不会自动给更新时间
            # obj = UserGroup.objects.filter(id=1).first()
            # obj.caption = "CEO"
            # obj.save()  //自动更新时间

        choices           -> django admin中显示下拉框,避免连表查询
        blank             -> django admin是否可以为空
        verbose_name      -> django admin显示字段中文
        editable          -> django admin是否可以被编辑
        error_messages    -> 错误信息欠
        help_text         -> django admin提示
        validators        -> django form ,自定义错误信息

3.根据类对数据库表中的数据进行各种操作

5.CharField 和 EmailField 其实都是字符串字段,但当给admin用时,EmailField能提供额外的验证。
一对多:
models.py:
    class UserGroup(models.Model):
        uid = models.AutoField(primary_key=True)
        caption = models.CharField(max_length=32,unique=True)

    class UserInfo(models.Model):
        username = models.CharField(max_length=32,blank=True,verbose_name='用户名')
        password = models.CharField(max_length=60, help_text='pwd')
        user_group = models.ForeignKey("UserGroup",to_field='uid')

如上所示,UserInfo类中虽然外键名为user_group, 但在生成的数据表中,它的名称是user_group_id, 如果在django使用user_group这个变量, 这将会代表其关联的表对象.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值