zoukankan      html  css  js  c++  java
  • Django 建立项目

    url别名和反向解析

    写法:url(r'^login/v2/', views.login,name='xx'),
    视图中反向解析:
    	from django.urls import reverse
    
        def login(request):
            print(reverse('xx'))  #/login/v2/
    	    if request.method == 'GET':
            return render(request,'login.html')
        else:
            uname = request.POST.get('uname')
            pwd = request.POST.get('pwd')
            if uname == 'chao' and pwd == '123':
    
                return HttpResponse('ok')
            else:
                return redirect(reverse('xx'))  #使用反向解析
                
    html模板渲染时反向解析的语法{% url 别名 %}
    	<form action="{% url 'xx' %}" method="post">
            {% csrf_token %}
            用户名:<input type="text" name="uname">
            密码:<input type="text" name="pwd">
            <input type="submit">
        </form>
    

    include路由分发

    1 项目文件夹下的urls.py文件中写上以下内容
    	from django.conf.urls import url,include
        urlpatterns = [
            url(r'^admin/', admin.site.urls),
            url(r'^app01/', include('app01.urls',namespace='app01')), #
            url(r'^app02/', include('app02.urls',namespace='app02')),
            #http://127.0.0.1:8000/index/
    
        ]
    
    2 在各个app应用文件夹下面创建urls.py文件
    	在urls.py文件中写自己应用的各个路径,比如app01 和 app02
    	app01:
            from django.conf.urls import url, include
            from django.contrib import admin
            from app01 import views
            urlpatterns = [
                url(r'^index/', views.index,name='index'),
            ]
    	app02:
    		from django.conf.urls import url, include
            from django.contrib import admin
            from app02 import views
            urlpatterns = [
                url(r'^index/', views.index,name='index'),
            ]
    
    
    
    
    

    url命名空间

    写法:url(r'^app01/', include('app01.urls',namespace='app01')), 
    	将每个应用自己的url路径划分一个空间,将来通过别名反向解析时,通过空间名称可以找到对应应用下面的路径
    使用:
    	views.py文件中写法
    		from django.urls import reverse
            def index(request):
                print('app01反向解析:', reverse('app01:index'))
                # app01反向解析: /app02/index/
                return HttpResponse('app01-index')
    	html中写法:
    		{% url 'app01:login' %}
    

    数据库操作

    orm

    object relational mapping 对象关系映射

    使用:

    第一步: 在应用文件夹下面的models.py文件中写对应的类,看下面的示例:

    class UserInfo(models.Model):
        id = models.AutoField(primary_key=True)  
        username = models.CharField(max_length=10)
        password = models.CharField(max_length=32)
    

    第二步:做数据库配置,settings.py文件中写上以下配置

    # DATABASES = {
    #     'default': {
    #         'ENGINE': 'django.db.backends.sqlite3',
    #         'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    #     }
    # }
    
    连接mysql的配置:	
        DATABASES = {
            'default': {
                'ENGINE': 'django.db.backends.mysql',
                'NAME':'orm01',
                'HOST':'127.0.0.1',
                'PORT':3306,
                'USER':'root',
                'PASSWORD':'123'
            }
        }
    

    第三步: 在项目文件夹下的的init文件中写上以下内容,来指定pymysql作为连接客户端

    import pymysql
    pymysql.install_as_MySQLdb()
    

    第四步: 执行数据库同步指令,在终端中执行

    python3.6 manage.py makemigrations  #在migrations文件夹下面生成记录文件
    python3.6 manage.py migrate         #执行记录文件
    

    表就创建好了,我们的表名就是: 应用名_类名小写

    表中数据的增删改查

    创建:
    方式一:
    obj=models.book_list(
                         book_name='潘金莲后传'
                         publisher='河南出版社'
                         )
                         obj.save()
    方式二:
     models.book_list.object.create(
                 book_name='潘金莲后传'
                  publisher='河南出版社'  )
    

    修改

    方式一:
    models.book_list.object.filter(id=1).update(
                   book_name='潘金莲后传2'
                   publisher='河南出版社1'
         )
    方式二:
    obj=models.book_list.objects.filter(id=1)[0]
    obj.book_name='潘金莲后传2'
    obj. publisher='河南出版社1'
    obj.save()
    批量创建:
    list_obj = []
    for i in range(10):
        obj = models.book(
        book_name = 'xx%s'%i,
        publisger = '北京%s'%i)
        models.book.objects.bulk_create(list_obj)
    update_or_create 有就更新,没有就创建
    a,b = models.book.objects.update_or_create(
             obj.book_name='潘金莲后传2'
             obj. publisher='河南出版社1'
    
    )
       print(a)  # 当前更新后的model对象,或者是你新增的记录的model对象
        print(b)  # 新增就是True,查询就False
    

    删除

    简单查询:
      ret=models.book.objects.filter(id=1)
      就是查询到id为1 的数据 得到一个对象列表
      obj=ret[0]
      就是得到一个列表
      得到列表里的属性就可以使用万能的点
      例如:
        obj.name
        obj.price
        
    

    查询方法:13个方法,必知必会

    .all()    jiushi 得到所有的数据
        #filter和get
        # ret = models.UserInfo.objects.get(age=18)
        # ret = models.UserInfo.objects.filter(age=180)
        # get两个报错,但是get请求返回的结果就是那个model对象
        # 1 UserInfo matching query does not exist. 啥也没查到
        # 2 get() returned more than one UserInfo -- it returned 11!  结果多了,不行! 
        # fitler不会报错 返回结果是一个queryset类型的集合,里面是一个一个的model对象
        注意:
        .filter()  就是根据条件进行筛选  从而获得数据
        .exclude()  就是排除满足条件的数据   从而得到剩下的数据   可以和.all().exclude()
             .filter.exclude()  使用
         .order_by('属性')    models.Book.objects.all().order_by('price')根据属性的升序排列
         如果想降序就在属性的前面添加一个'-'号  比如:'-price'
         .count() 统计数据库中对象的数量   ret = models.book.objects.all().count()
         .exists()   检验该数据是否在数据库中
         
        .valuse()   调用指定的属性值  models.book.objects.values('price','name')    
         .values_list(*field):   它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列
        <13> distinct():            values和values_list得到的queryset类型的数据来调用,从返回结果中剔除重复纪录
     ret = models.UserInfo.objects.all().values('age','username').distinct()               ret = models.UserInfo.objects.values('age','username').distinct()  
       
    

    创建时,日期字段数据的添加方式

    models.Book.objects.create(
                # publish_date = "2019-08-01",  字符串
                # publish_date = datetime.datetime.now(), 时间日期数据
            )
    
  • 相关阅读:
    C—动态内存分配之malloc与realloc的区别
    C++动态内存管理之深入探究new和delete
    Linux粘滞位的设置
    linux—find指令常见用法示例
    Linux系统date命令的参数及获取时间戳的方法
    Linux系统文件的三个重要时间详解
    《Linux命令行与shell脚本编程大全 第3版》Shell脚本编程基础---27
    《Linux命令行与shell脚本编程大全 第3版》Shell脚本编程基础---26
    《Linux命令行与shell脚本编程大全 第3版》Shell脚本编程基础---25
    《Linux命令行与shell脚本编程大全 第3版》Shell脚本编程基础---24
  • 原文地址:https://www.cnblogs.com/x-h-15029451788/p/11907150.html
Copyright © 2011-2022 走看看