• Python 学习第十九天 django知识


    一,django 知识总结

    1,同一个name属性的标签,多个值获取

    <form action="/login/" method="POST" enctype="multipart/form-data">
            <p>
                <input type="text" name="user" placeholder="用户名" />
            </p>
            <p>
                <input type="password" name="pwd" placeholder="密码" />
            </p>
            <p>
                男:<input type="radio"  name="gender" value="1"/>
                女:<input type="radio" name="gender" value="2"/>
                张扬:<input type="radio" name="gender" value="3"/>
            </p>
            <p>
                男:<input type="checkbox"  name="favor" value="11"/>
                女:<input type="checkbox" name="favor" value="22"/>
                张扬:<input type="checkbox" name="favor" value="33"/>
            </p>
    <from>
    view.py函数
        v = request.POST.getlist('favor')
    

     2,select 标签多选

    <p>
                <select name="city" multiple>                               #select标签添加multiple属性
                    <option value="sh">上海</option>
                    <option value="bj">北京</option>
                    <option value="tj">天津</option>
                </select>
     </p>
    

    3,文件上传

    #form 表单中设置 
    <form action="/login/" method="POST" enctype="multipart/form-data">
    view.py
    obj = request.FILES.get('fafafa')
    print(obj,type(obj),obj.name) import os file_path = os.path.join('upload', obj.name) f = open(file_path, mode="wb") for i in obj.chunks(): f.write(i) f.close()

     4,模板语言循环操作字典

    view.py 中定义字典
    USER_DICT = {
         'k1': 'root1',
         'k2': 'root2',
         'k3': 'root3',
         'k4': 'root4',
     }
    
    tamplates 中的html模板中读取
    
    {% for k,row in user_dict.items %}
        <li>{{ k }}-{{ row }}</li>
    {% endfor % }
    

     5,tamplates 的html获取字典中的值

    html
    1,跳转html <li><a target="_blank" href="/detail-{{k}}.html”>{{ row.name }} </a></li>
    2,跳转后的html <h1> 详细信息</h1> <h6>用户名:{{ detail_info.name }}</h6> <h6>邮箱:{{ detail_info.email }}</h6> views.py函数 def detail(request,nid): detail_info = USER_DICT[nid] return render(request, 'detail.html', {'detail_info': detail_info})
    url.py
    url(r'^detail-(d+).html', views.detail),

     6,django url 正则匹配

        (1)在django url 中传参数,发送给后端的views.py中的处理函数,有时候会遇到传多个参数的问题,例如 url(r'^detail-(d+)-(d+).html',views.detail), 在views.py函数中接收,def detail(request,nid,uid),函数定义中传入多个形式参数,来接收url的变量,且变量的值和detail函数的参数位置是一致的,

      (2)在django url 中添加?P,确定url中参数对应的变量名,这样detail函数中定义的形式参数位置可以任意放置

    url(r'^detail-(?P<nid>d+)-(?P<uid>d+).html',views.detail)
    
    def detail(request,uid,nid)
    def detail(request,nid,uid)                                                    #都可以自行接收自己的值     
    

        (3)wiews.y函数中接收多个参数  def    detail(request,*args,**kwargs) *args是以元组的形式接收参数,**kwargs是以字典的形式接收参数

      总结  

    a.  url中单个正则表达式
    	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 中的正则表达式以key.value形式定义
    	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)

     7,django url 中的name属性,对URL路由关系进行命名

        (1) 在url中可以为一个url设置一个别名 例如 ('r‘indexaaaabbbaa’,views.index,name="index")

      (2) 在templates 的html中引用 <form action="{% url 'index' %}" method="POST"></form>

      (3) <form action="{{ request.path_info }}" method="POST" ></form>提交完成之后跳转本页 ,path_info 获取当前url

      (4) 在 wiews.py函数中重写url 

    from django.urls import reverse
    def index(request):
        v=reverse('indexx')
        print(v)                              #v为生成的url,当url 中不含参数时例如url(r'index',index,name="indexx")
    def index(request,nid):
        v=reverse('indexx' args=(90,))        #当url 中含一个参数时例如url(r'index/(d+)/',index,name="indexx")
    def index(request,nid,vid):
       v=reverse('indexx',args=(90,10,)) #当url 中含多个参数例如url(r'index/(d+)/(d+)/',index,name="indexx")
    def index(request,nid,vid):
       v=reverse('indexx',kwargs={'nid':1,'vid':10} #当url中含?P时例如url(r'index/(?P<nid>d+)/(?P<uid>d+)/',index,name="indexx")
    #form 表单里面传值<form action="{% url 'index' nid=1 uid=3 %}" method="POST"></form>

      (5)url分类,多个app url分发

       在主程序django project 下的url 中添加app的url

        url(r'^cmdb/',include("app01.urls")),         #到app01中加载app01的urls文件

        url(r'^monitor/',include("app02.urls")),      #到app02中加载app02的urls文件

     8,django ORM操作数据库

       1,创建数据库

    (1)创建类

    from django.db import models
    # app01_userinfo
    class UserInfo(models.Model):
            # id列,自增,主键 
    	username = models.CharField(max_length=32)   	# id列,自增,主键 
    	password = models.CharField(max_length=64)    	# 用户名列,字符串类型,指定长度
    

     (2)注册APP

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

     (3)执行命令

    python manage.py  makemigrations
    python manage.py  migrate
    

     (4)注意

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

      2,数据写入

      方法一:

      models.UserInfo.objects.create(username="root",password="123")

      方法二:

      dict = {'username':'eric','password':'123'}

      models.UserInfo.objects.create(**dict)

      方法三:

      obj = models.UserInfo(username='jack',password='123')

          obj.save()

       3,数据查找

      (1) 查取所有 result = models.UserInfo.objects.all()

      result为QuerySet类型,为django的数据类型,可以看做一个列表,表当中有多少条数据,列表中就有多少个元素,每个元素其实就是一个obj对象,对象中包含  的内容就是表的每一个字段,例如[obj(id,username,password),obj(id,username,password),obj(id,username,password)],最终的读取可以用如下代码

    for row in result:
        print(row.id,row.username,row.password)
    

       (2)根据条件查值 result = models.UserInfo.object.filter(username='root')

        result = models.UserInfo.object.filter(username='root',password='123') 相当于and username 和password

        4,数据删除

      result = models.UserInfo.object.filter(username='root',password='123').delete()删除此行数据

        5,数据修改

      result = models.UserInfor.object.filter(username='root',password='123').update(password="666")

        6,数据操作其他方法

      models.UserInfo.object.filter(password='123').first() 找到第一个或者.count()统计个数

    9,django admin 配置

     (1)创建后台管理员 python manage.py createsuperuser

       (2)配置后台管理url url(r'^admin/',admin.site.urls)

     (3)注册和配置django后台管理页面

       1,打开admin.py,配置如下   

    from django.contrib import admin
      
    from app01 import  models
      
    admin.site.register(models.UserType)
    admin.site.register(models.UserInfo)
    admin.site.register(models.UserGroup)
    admin.site.register(models.Asset)
    

          2,设置数据表名称

    class UserType(models.Model):
        name = models.CharField(max_length=50)
      
        class Meta:
            verbose_name = '用户类型'
            verbose_name_plural = '用户类型'
    

     10,django models 字段类型

         整体包括五类:(1)字符串(2)数字(3)时间(4)二进制(5)自增类型

       AutoField(Field)
            - int自增列,必须填入参数 primary_key=True
    例如
      class UserGroup:
        uid = models.AutoField(primary_key=True) BigAutoField(AutoField) - bigint自增列,必须填入参数 primary_key=True 注:当model中如果没有自增列,则自动会创建一个列名为id的列 from django.db import models class UserInfo(models.Model): # 自动创建一个列名为id的且为自增的整数列 username = models.CharField(max_length=32) class Group(models.Model): # 自定义自增列 nid = models.AutoField(primary_key=True) name = models.CharField(max_length=32) SmallIntegerField(IntegerField): - 小整数 -32768 ~ 32767 PositiveSmallIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField) - 正小整数 0 ~ 32767 IntegerField(Field) - 整数列(有符号的) -2147483648 ~ 2147483647 PositiveIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField) - 正整数 0 ~ 2147483647 BigIntegerField(IntegerField): - 长整型(有符号的) -9223372036854775808 ~ 9223372036854775807 自定义无符号整数字段 class UnsignedIntegerField(models.IntegerField): def db_type(self, connection): return 'integer UNSIGNED' PS: 返回值为字段在数据库中的属性,Django字段默认的值为: 'AutoField': 'integer AUTO_INCREMENT', 'BigAutoField': 'bigint AUTO_INCREMENT', 'BinaryField': 'longblob', 'BooleanField': 'bool', 'CharField': 'varchar(%(max_length)s)', 'CommaSeparatedIntegerField': 'varchar(%(max_length)s)', 'DateField': 'date', 'DateTimeField': 'datetime', 'DecimalField': 'numeric(%(max_digits)s, %(decimal_places)s)', 'DurationField': 'bigint', 'FileField': 'varchar(%(max_length)s)', 'FilePathField': 'varchar(%(max_length)s)', 'FloatField': 'double precision', 'IntegerField': 'integer', 'BigIntegerField': 'bigint', 'IPAddressField': 'char(15)', 'GenericIPAddressField': 'char(39)', 'NullBooleanField': 'bool', 'OneToOneField': 'integer', 'PositiveIntegerField': 'integer UNSIGNED', 'PositiveSmallIntegerField': 'smallint UNSIGNED', 'SlugField': 'varchar(%(max_length)s)', 'SmallIntegerField': 'smallint', 'TextField': 'longtext', 'TimeField': 'time', 'UUIDField': 'char(32)', BooleanField(Field) - 布尔值类型 NullBooleanField(Field): - 可以为空的布尔值 CharField(Field) - 字符类型 - 必须提供max_length参数, max_length表示字符长度 TextField(Field) - 文本类型 EmailField(CharField): - 字符串类型,Django Admin以及ModelForm中提供验证机制 IPAddressField(Field) - 字符串类型,Django Admin以及ModelForm中提供验证 IPV4 机制 GenericIPAddressField(Field) - 字符串类型,Django Admin以及ModelForm中提供验证 Ipv4和Ipv6 - 参数: protocol,用于指定Ipv4或Ipv6, 'both',"ipv4","ipv6" unpack_ipv4, 如果指定为True,则输入::ffff:192.0.2.1时候,可解析为192.0.2.1,开启刺功能,需要protocol="both" URLField(CharField) - 字符串类型,Django Admin以及ModelForm中提供验证 URL SlugField(CharField) - 字符串类型,Django Admin以及ModelForm中提供验证支持 字母、数字、下划线、连接符(减号) CommaSeparatedIntegerField(CharField) - 字符串类型,格式必须为逗号分割的数字 UUIDField(Field) - 字符串类型,Django Admin以及ModelForm中提供对UUID格式的验证 FilePathField(Field) - 字符串,Django Admin以及ModelForm中提供读取文件夹下文件的功能 - 参数: path, 文件夹路径 match=None, 正则匹配 recursive=False, 递归下面的文件夹 allow_files=True, 允许文件 allow_folders=False, 允许文件夹 FileField(Field) - 字符串,路径保存在数据库,文件上传到指定目录 - 参数: upload_to = "" 上传文件的保存路径 storage = None 存储组件,默认django.core.files.storage.FileSystemStorage ImageField(FileField) - 字符串,路径保存在数据库,文件上传到指定目录 - 参数: upload_to = "" 上传文件的保存路径 storage = None 存储组件,默认django.core.files.storage.FileSystemStorage width_field=None, 上传图片的高度保存的数据库字段名(字符串) height_field=None 上传图片的宽度保存的数据库字段名(字符串) DateTimeField(DateField) - 日期+时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] DateField(DateTimeCheckMixin, Field) - 日期格式 YYYY-MM-DD TimeField(DateTimeCheckMixin, Field) - 时间格式 HH:MM[:ss[.uuuuuu]] DurationField(Field) - 长整数,时间间隔,数据库中按照bigint存储,ORM中获取的值为datetime.timedelta类型 FloatField(Field) - 浮点型 DecimalField(Field) - 10进制小数 - 参数: max_digits,小数总长度 decimal_places,小数位长度 BinaryField(Field) - 二进制类型

       11 django models 字段的限制参数

    null                                       #db是否可以为空 =True
    default                                    # 默认值  =""
    primary_key                                #主键     =True
    db_column                                  #列名     ="user"
    db_index                                   #索引     =True
    unique	                                   #唯一索引 =True
    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中显示的下拉框,避免连表查询
        class UserInfo(models.Model):
        
           username = models.CharField(max_length=32)
            user_type_choices = (
                  (1,'超级用户'),
                 (2,'普通用户'),
                  (3,'普普通用户'),
            )    
            user_type_id = models.IntegerField(choices=user_type_choices,default=1)    
    blank                                       #django admin是否可以为空
    verbose_name                                #django admin显示字段中文
    editable                                    #django admin是否可以被编辑
    error_messages                              #错误信
    help_text                                   #django admin提示
    validators
    

     12,django  models外键设置

    class UserGroup(models.Model):
        uid = models.AutoField(primary_key=True)
        caption = models.CharField(max_length=32,unique=True)
        ctime = models.DateTimeField(auto_now_add=True, null=True)
        uptime = models.DateTimeField(auto_now=True, null=True)
    
    
    # user_list = Userinfo.objects.all()
    # 读取的时一个queryset的列表对象,封装了id,username,email,user_group_id, 在user_group_id中又封装#了uid和caption
    # [obj(id,username,email,user_group_id,,user_group_id(uid,caption)),obj,obj]
    # for row in user_list:
    #     print(row.user_group_id)
    #     print(row.user_group.uid)
    #     print(row.user_group.caption)
    class UserInfo(models.Model):
        # id列,自增,主键
        # 用户名列,字符串类型,指定长度
        # 字符串、数字、时间、二进制
        username = models.CharField(max_length=32,blank=True,verbose_name='用户名')
        password = models.CharField(max_length=60, help_text='pwd')
        email = models.CharField(max_length=60)
        test = models.EmailField(max_length=19,null=True,error_messages={'invalid': '请输入密码'})
        # user_group_id 数字
        user_group = models.ForeignKey("UserGroup",to_field='uid') # (uid,catption,ctime,uptimew)
        user_type_choices = (
            (1, '超级用户'),
            (2, '普通用户'),
            (3, '普普通用户'),
    
  • 相关阅读:
    HttpClient
    Windows Runtime (RT)
    大败局
    postgresql+postgis+pgrouting实现最短路径查询(1)---线数据的处理和建立拓扑
    postgresql+postgis+pgrouting实现最短路径查询(2)---openlayers+geoserver实现最短路径
    nodejs+postgis实现搜周边
    mac环境下安装posgreSQL,postGIS,pgrouting方法
    postgresql+postgis+pgrouting实现最短路径查询(3)--流程图
    openlayers中的自定制工具栏,包含画点、线、面
    经常用到的23种广告代码。包括图片切换、对联广告等
  • 原文地址:https://www.cnblogs.com/system-public/p/6159842.html
Copyright © 2020-2023  润新知