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.pyobj = 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获取字典中的值

html1,跳转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.pyurl(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, ‘普普通用户‘),
时间: 2024-11-07 00:46:39

Python 学习第十九天 django知识的相关文章

python学习笔记十五 django基础

Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能. 1.创建django程序 通过命令行 django-admin startproject mysite 创建project 一个工程可以包含多个app,app共用一个project的配置文件 cd mysite python manage.py startapp app01 创建app01 pyt

python学习笔记十六 django深入学习一

django 请求流程图 django 路由系统 在django中我们可以通过定义urls,让不同的url路由到不同的处理函数 from . import views urlpatterns = [ url(r'^articles/2003/$', views.special_case_2003), #精确匹配 url(r'^articles/([0-9]{4})/$', views.year_archive), #动态路由 url(r'^articles/([0-9]{4})/([0-9]{2

Python 学习第二十三天 django 知识(五)

一,django 的model操作 1,字段 AutoField(Field) - int自增列,必须填入参数 primary_key=True BigAutoField(AutoField) - bigint自增列,必须填入参数 primary_key=True 注:当model中如果没有自增列,则自动会创建一个列名为id的列 from django.db import models class UserInfo(models.Model): # 自动创建一个列名为id的且为自增的整数列 us

python 学习第二十一天,django知识(三)

一,django的url路由系统总结 1,url(/index/,函数或者类) 2,url(/index/(\d+), 函数或者类) 3,url(/index/(?P<nid>\d+),函数或者类) 4,url(/index/(?P<nid>\d+),name="root",函数或者类) (1) 在views.py文件中通过reverse()反转url (2) 在templates中的文件中引用{% url 'root' 1 %} 5,url(/crm/,inc

python 学习笔记十九 django项目bbs论坛

跨站请求伪造保护 CSRF 中间件和模板标签提供对跨站请求伪造简单易用的防护.某些恶意网站上包含链接.表单按钮或者JavaScript ,它们会利用登录过的用户在浏览器中的认证信息试图在你的网站上完成某些操作,这就是跨站攻击.还有另外一种相关的攻击叫做“登录CSRF”,攻击站点触发用户浏览器用其它人的认证信息登录到其它站点. 全局: 中间件 django.middleware.csrf.CsrfViewMiddleware 局部: @csrf_protect,为当前函数强制设置防跨站请求伪造功能

python学习第十九天

Django 获取一个项目的多个数据  request.POST.getlist('favor') 上传文件 import os obj =request.FILES.get('') file_path =os.path.join('upload',obj.name) with open(file_path,'wb') as f: for i in obj.chunks(): f.write(i) FBV function base view CBV class base view url对应关

python学习第十九天三元运算符与php语言区别

三元运算符是条件语句的简写,常见的条件语句写三行,三元运算符只需要写一行,python三元运算符是怎么写的呢 1,常见条件判断 if a<b: print(a) else: print(b) 2,三元运算符 val=a if a<b else b 如果a小于b 就等于a 否则 等于b 3,php语言的三元运算 $id = isset($_GET['id']) ? $_GET['id'] : false; 接收的id存在 取值 $id= $_GET['id']  否则 false 文章来自 (玖

python学习第九十九天:版本控制 渲染器 分页器

版本控制 版本控制: 方法一 1 127.0.0.1/course/?version=v100000 用from rest_framework.versioning import QueryParameterVersioning 在视图类里: versioning_class=QueryParameterVersioning(**不再是列表) 在setting里配置: REST_FRAMEWORK={ 'VERSION_PARAM':'version', 'DEFAULT_VERSION':'v

python学习笔记十——异常处理

1.try: command except 错误类型,记录错误信息变量: command finally: command try...finally的用处是无论是否发生异常都要确保资源释放代码的执行.一般来说,如果没有发生错误,执行过try语句块之后执行finally语句块,完成整个流程.如果try语句块发生了异常,抛出了这个异常,此时就马上进入finally语句块进行资源释放处理.如下从几个细节讨论finally的特性. 1).try中的return: 当在try语句块中含有return语句