搜索
简帛阁>技术文章>django创建表单以及表单数据类型和属性

django创建表单以及表单数据类型和属性

08.15自我总结

关于django的表单不同关系之间的创建

一.不同关系之间的创建

1.一对一

举例

母表:userinfo

id name age
1 张三 12
2 李四 58

字表:private

id salary sp_id
1 100 1
2 400 2

models.py

复制class UserInfo(models.Model):
    name = models.CharField(max_length=32, null=True)
    age  = models.IntegerField(null=True)
    
class Private(models.Model):
    salary = models.CharField(max_length=32, null=True)
    sp = models.OneToOneField("UserInfo", null=True) #oneTooneField: 一对一, 默认要求该字段必须是唯一的 unique 外键关系

插入信息

复制models.UserInfo.objects.create(name='张三',age=12)
models.Private.objects.create(salary=100,sp_id=1)

查询

复制#从母表查询子表中的数据

#方法1:res = models.UserInfo.objects.filter(name='张三').first().private.salary #子表表名小写.子表字段名
#方法2:res = models.UserInfo.objects.filter(name='张三').values('private__salary')
复制#从子表查询母表信息
#方法1:res = models.Private.objects.filter(salary='100').first().sp.name

#方法2:res = models.Private.objects.values('sp__name'):

2.多对多(通过关系表)

models.py

复制class Boy(models.Model):
    bname = models.CharField(max_length=30,null=True)
    
class Girl(models.Model):
    gname = models.CharField(max_length=30,null=True)

class Boy2Girl(models.Model):
    b = models.ForeignKey('Boy',null=True)
    g = models.ForeignKey('Girl',null=True)
    #联合唯一属性
    class Meta:
        unique_together=[
            ('b','g')
        ]

插入信息

复制import random
boys =[
    models.Boy(bname='男1'),
    models.Boy(bname='男2'),
    models.Boy(bname='男3'),
    models.Boy(bname='男4'),
    models.Boy(bname='男5'),
    models.Boy(bname='男6')
]
res = models.Boy.objects.bulk_create(boys)

girls =[
    models.Girl(gname='女1'),
    models.Girl(gname='女2'),
    models.Girl(gname='女3'),
    models.Girl(gname='女4'),
    models.Girl(gname='女5'),
    models.Girl(gname='女6'),
    models.Girl(gname='女7'),
    models.Girl(gname='女8'),
]
models.Girl.objects.bulk_create(girls)

a = [
    models.Boy2Girl(b_id=random.randint(1,6),g_id=1),
    models.Boy2Girl(b_id=random.randint(1,6),g_id=2),
    models.Boy2Girl(b_id=random.randint(1,6),g_id=3),
    models.Boy2Girl(b_id=random.randint(1,6),g_id=4),
    models.Boy2Girl(b_id=random.randint(1,6),g_id=5),
    models.Boy2Girl(b_id=random.randint(1,6),g_id=6),
    models.Boy2Girl(b_id=random.randint(1,6),g_id=7),
    models.Boy2Girl(b_id=random.randint(1,6),g_id=8),
]
models.Boy2Girl.objects.bulk_create(a)

查询

复制#通过关系表查询,查boy位男1对于的女的信息
#方法1:res = models.Boy2Girl.objects.filter(b__bname='男1').values('g__gname')

#方法2:
 res = models.Boy2Girl.objects.filter(b__bname='男1').all()
 for a in res:
    print(res.g.gname)
    
#通过boy表查女的信息
#方法1:    res = models.Boy.objects.filter(bname='男1').values('boy2girl__g__gname')

#方法2:
    res = models.Boy.objects.filter(bname='男1').all()
    for a in res:
        for b in a.boy2girl_set.all():
            print(b.g.gname)

3.多对多(不通过关系表)

models.py

复制class Boy1(models.Model):
    bname = models.CharField(max_length=32, null=True)
    g = models.ManyToManyField('Girl', null=True)
 #他会生成一个boy1_g的表

class Girl1(models.Model):
    gname = models.CharField(max_length=32, null=True)

插入信息

复制boys =[
    models.Boy(bname='男1'),
    models.Boy(bname='男2'),
    models.Boy(bname='男3'),
    models.Boy(bname='男4'),
    models.Boy(bname='男5'),
    models.Boy(bname='男6')
]
res = models.Boy1.objects.bulk_create(boys)
#
girls =[
    models.Girl(gname='女1'),
    models.Girl(gname='女2'),
    models.Girl(gname='女3'),
    models.Girl(gname='女4'),
    models.Girl(gname='女5'),
    models.Girl(gname='女6'),
    models.Girl(gname='女7'),
    models.Girl(gname='女8'),
]
models.Girl1.objects.bulk_create(girls)

建立两者关系

  • 取出boy的对象
  • 再选择其中的g对象,再进行add添加|删除|查询girl的id

添加(add)

复制models.Boy1.objects.filter(bname='男1').first().g.add(1,2,3,4,5,2) #会自动去重保持唯一性也不会因为相同而报错

删除(remove)

复制models.Boy1.objects.filter(bname='男1').first().g.remove(1)

查询(all)

复制models.Boy1.objects.filter(bname='男1').first().g.all()

清除(clear)

复制models.Boy1.objects.filter(bname='男1').first().g.clear() #清除所有

注意点

add进行添加时候如果有会自动去重,他自带联合唯一的效果

4.一对多

https://www.cnblogs.com/pythonywy/p/11353202.html看这里

二.mysql与djamgo-orm数据类型对应关系

数据类型 mysql djamgo-orm
数字 tinyint 不存在
- smallint SmallIntegerField(有符号) PositiveSmallIntegerField(没符号)
- mediumint 不存在
- int (unsigned) IntegerField(有符号)PositiveIntegerField(没符号)
- bigint BigIntegerField(有符号) PositiveBigIntegerField(没符号)
- decimal DecimalField
- float FloatField
- double 不存在
字符串 char 不存在
- varchar CharField
- text TextField
时间日期 date DateField
- datetime DateTimeField
- timestamp 不存在

三.mysql与djamgo-orm数据类型对应属性

复制null                数据库中字段是否可以为空
db_column           数据库中字段的列名
default             数据库中字段的默认值
primary_key         数据库中字段是否为主键
db_index            数据库中字段是否可以建立索引
unique              数据库中字段是否可以建立唯一索引


class Meta:
### 联合唯一索引
unique_together=[
('b', 'g')
]

#### 联合索引
index_together = [
('b', 'g')
]

四.djamgo只在admin中生效的数据类型

  • EmailField(CharField):字符串类型对应信息是不是邮箱格式进行验证
  • 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:允许文件夹
  • ImageField(FileField):字符串类型 路径保存在数据库,文件上传到指定目录
    • 参数:
      • upload_to = "" : 上传文件的保存路径
      • storage = None:存储组件,默认django.core.files.storage.FileSystemStorage
      • ImageField(FileField):上传图片的高度保存的数据库字段名(字符串)
      • height_field=None:上传图片的宽度保存的数据库字段名(字符串)

五.djamgo只在admin中生效的属性

  • verbose_name:Admin中显示的字段名称

  • blank:Admin中是否允许用户输入为空

  • editable:Admin中是否可以编辑

  • help_text:Admin中该字段的提示信息

  • choices:Admin中显示选择框的内容,用不变动的数据放在内存中从而避免跨表操作

    • 如:gf = models.IntegerField(choices=[(0, '何穗'),(1, '大表姐'),],default=1)
  • error_messages: 自定义错误信息(字典类型),从而定制想要显示的错误信息;

    • from django.core.validators import RegexValidator
      from django.core.validators import EmailValidator,URLValidator,DecimalValidator,
      MaxLengthValidator,MinLengthValidator,MaxValueValidator,MinValueValidator
      如:
      test = models.CharField(
      max_length=32,
      error_messages={
      'c1': '优先错信息1',
      'c2': '优先错信息2',
      'c3': '优先错信息3',
      },
      validators=[
      RegexValidator(regex='root_\d+', message='错误了', code='c1'),
      RegexValidator(regex='root_112233\d+', message='又错误了', code='c2'),
      EmailValidator(message='又错误了', code='c3'), ]
      )

1在bookapp目录下新建一个formspy,并加入fromdjangoimportformsclassRegisterForms(formsForm):testformsField(require
一、Form表单settingspyINSTALLED_APPS['practiseappsPractiseConfig',]urlspyurlpatterns[path('practise/',in
django表单系统,分2种基于djangoformsForm的所有表单类的父类基于djangoformsModelForm,可以模型类绑定的Form直接用原生的form表单,也可以直接用,较麻
form表单标签表单标签:form(非常重要,必须掌握)form标签用于获取用户跟浏览器交互(包含输入,选择,上传文件等操作)的数据,并将数据打包发给服务端属性action:控制数据的提交路径acti
表单中的只读禁用属性1只读:服务器方不希望用户修改数据,只是要求这些数据在表单中显示。例如注册或交易协议,商品价格等。2禁用:只有满足某个条件后,才能使用某项功能。例如,只有用户同意注册协议后才允许
HTML<formidproject_file_uploadenctypemultipart/formdata><divclassmodalbody><!multiple
django搭建BBS表单创建注册0824自我总结文件结构app接口migrations__inint__pyadminpy管理员页面注册表单用appspybbsformpyform组件相关设置mo
在通过djangoformsForms创建表单字段时,其中每个字段都有一些自定义的验证逻辑一些其他钩子虽然表单字段的Field类主要使用在Form类中,但也可以直接实例化来使用它们,以更好的了解它
实现:表单验证工程示例:urlspyfromdjangoconfurlsimporturlfromdjangocontribimportadminfromapp01importviewsurlpatt
django带有一个form库,djangoforms。将要处理的HTML的<Form>定义一个form类,放到一个文件中:formspy文件中。fromdjangoimportforms