首页 > 代码库 > Django框架基础(二)

Django框架基础(二)

MODELS

技术分享
 1    对数据库起效的字段设置: 2         数据类型:CharField 3                   IntegerField 4                   FloatField 5                   DecimalField(max_digits=30,decimal_places=10) 6                   DateTimeField 7  8  9         字段参数:null=True  default=‘‘   unique=True   db_index=True  premary_key10         class Meta:11         unique_together=(12             (email,ctime)13         )14         index_together=(15             (email,ctime)16         )17 18    对admin起效的字段设置:19          数据类型:20                字符串:21             EmailField(CharField):22             IPAddressField(Field)23             URLField(CharField)24                     SlugField(CharField)25             UUIDField(Field)26             FilePathField(Field)27             FileField(Field)28             ImageField(FileField)29             CommaSeparatedIntegerField(CharField)30 31                 枚举:32                      color_list = (33                     (1,黑色),34                     (2,白色),35                     (3,蓝色)36                         )37              color = models.IntegerField(choices=color_list)38                      应用场景:选项固定39                                 40              PS: FK选项动态41          字段参数:42                  verbose_name        Admin中显示的字段名称43                  blank               Admin中是否允许用户输入为空44                  editable            Admin中是否可以编辑45                  help_text           Admin中该字段的提示信息46                  choices             Admin中显示选择框的内容,用不变动的数据放在内存中从而避免跨表操作47                  test=models.CharField(48                      max_length=32,49                      error_messages={50                         c1:优先错误信息51                            },52                      validators=[RegexValidator(regex=root_\d+,message=error,code=c1)],53                      null=True54     )
字段

参考博客:http://www.cnblogs.com/wupeiqi/articles/6216618.html

技术分享
 1 class Userinfo(models.Model): 2     username=models.CharField(max_length=32) 3     password=models.IntegerField(max_length=16) 4  5     email=models.EmailField(null=True,default=1111,unique=True,blank=True,verbose_name=邮箱) 6     ctime=models.DateTimeField(null=True) 7     test=models.CharField( 8         max_length=32, 9         error_messages={10             c1:优先错误信息11         },12         validators=[RegexValidator(regex=root_\d+,message=error,code=c1)],13         null=True14     )15     color_list=(16         (1,black),17         (2,white),18         (3,blue),19     )20     color=models.IntegerField(choices=color_list)21 22     class Meta:23         unique_together=(24             (email,ctime)25         )26         index_together=(27             (email,ctime)28         )
View Code

 

ORM数据表多对多操作:

1 自定义第三张表:

技术分享
 1     class Gril(models.Model): 2     nick=models.CharField(max_length=64) 3  4  5     class Boy(models.Model): 6     name=models.CharField(max_length=64) 7  8     class Love(models.Model): 9     b=models.ForeignKey(Boy)10     g=models.ForeignKey(Gril)11     class Meta:    #设置联合唯一索引12         unique_together=[13             (b,g),14         ]15 16  查询和Alex1 有关系的姑娘17         obj=models.Boy.objects.filter(name=alex1).first()18         love_list=obj.love_set.all()19         for row in love_list:20             print(row.g.nick)21 22         love_list=models.Love.objects.filter(b__name=alex1)23         for row in love_list:24             print(row.g.nick)25 26         love_list=models.Love.objects.filter(b__name=alex1).values(g__nick)27         for item in love_list:28             print(item[g__nick])29 30         love_list=models.Love.objects.filter(b__name=alex1).select_related(g)31         for obj in love_list:32             print(obj.g.nick)
View Code

2 Django自动生成关系表:

技术分享
 1 class Gril(models.Model): 2     nick=models.CharField(max_length=64) 3     m=models.ManyToManyField(Boy)               #Django内置的多对多连表设置 4  5 django 内置的多对多连表操作,不能直接对连表进行操作,可以间接操作 6         # obj=models.Gril.objects.filter(nick=‘egon1‘).first() 7         # print(obj.nick,obj.id) 8         # obj.m.add(2) 9         # obj.m.add(2,4)10         # obj.m.add(*[1,])11 12         # obj.m.remove(1)13         # obj.m.remove(*[2,4])14         # obj.m.set([1,])15 16         # q=obj.m.all()17         # print(q)     #<QuerySet [<Boy: Boy object>]>18         #19         # boy_list=obj.m.filter(name=‘alex1‘).first()20         # print(boy_list.name)21 22         # obj=models.Gril.objects.filter(nick=‘egon1‘).first()23         # obj.m.clear()24         #反向操作25         # obj=models.Boy.objects.filter(name=‘alex1‘).first()26         # v=obj.gril_set.all()27         # print(v)
View Code

3杂交:

技术分享
 1                         class Boy(models.Model): 2                 name = models.CharField(max_length=32) 3                 m = models.ManyToManyField(Girl,through="Love",through_fields=(b,g,)) 4                 # 查询和清空 5  6             class Girl(models.Model): 7                 nick = models.CharField(max_length=32) 8                 # m = models.ManyToManyField(‘Boy‘) 9 10             class Love(models.Model):11                 b = models.ForeignKey(Boy)12                 g = models.ForeignKey(Girl)13 14                 class Meta:15                     unique_together = [16                         (b,g),17                     ]
View Code

4 自关联   自定义第三张表:

技术分享
 1 class UserInfo(models.Model): 2     nickname=models.CharField(max_length=64) 3     username=models.CharField(max_length=64) 4     password=models.CharField(max_length=64) 5     gender_choice=( 6         (1,), 7         (2,), 8     ) 9     gender=models.IntegerField(choices=gender_choice)10 11 class U2U(models.Model):12     g=models.ForeignKey(to=UserInfo,to_field=id,related_name=boys)13     b=models.ForeignKey(to=UserInfo,to_field=id,related_name=grils)
View Code
技术分享
1     xz=models.UserInfo.objects.filter(id=1).first()2     result=xz.gril.all()3     for u in result:4         print(u.g.nickname)
View Code

 

 5 自关联   自动生产第三张表:

技术分享
 1 class UserInfo(models.Model): 2     nickname=models.CharField(max_length=64) 3     username=models.CharField(max_length=64) 4     password=models.CharField(max_length=64) 5     gender_choice=( 6         (1,), 7         (2,), 8     ) 9     gender=models.IntegerField(choices=gender_choice)10     m=models.ManyToManyField(UserInfo)
View Code
技术分享
 1     # 查男生 2     xz = models.UserInfo.objects.filter(id=1).first() 3     u = xz.m.all() 4     for row in u: 5         print(row.nickname) 6     # 查女神 7     xz = models.UserInfo.objects.filter(id=4).first() 8     v = xz.userinfo_set.all() 9     for row in v:10         print(row.nickname)11     return HttpResponse(...)
View Code

 

6 FK 自关联

技术分享
 1 class Comment(models.Model): 2     """ 3     评论表 4     """ 5     news_id = models.IntegerField()            # 新闻ID 6     content = models.CharField(max_length=32)  # 评论内容 7     user = models.CharField(max_length=32)     # 评论者 8     reply = models.ForeignKey(Comment,null=True,blank=True,related_name=xxxx) 9 """10    新闻ID                         reply_id11 1   1        别比比    root         null12 2   1        就比比    root         null13 3   1        瞎比比    shaowei      null14 4   2        写的正好  root         null15 5   1        拉倒吧    由清滨         216 6   1        拉倒吧1    xxxxx         217 7   1        拉倒吧2    xxxxx         518 """19 """20 新闻121     别比比22     就比比23         - 拉倒吧24             - 拉倒吧225         - 拉倒吧126     瞎比比27 新闻2:28     写的正好29 """
View Code

 

 admin

django amdin是django提供的一个后台管理页面,改管理页面提供完善的html和css,使得你在通过Model创建完数据库表之后,就可以对数据进行增删改查,而使用django admin 则需要以下步骤:

  • 创建后台管理员
  • 配置url
  • 注册和配置django admin后台管理页面

1、创建后台管理员

1
python manage.py createsuperuser

2、配置后台管理url

1
url(r‘^admin/‘, include(admin.site.urls))

3、注册和配置django admin 后台管理页面

 a、在admin中执行如下配置

技术分享
1 from django.contrib import admin2   3 from app01 import  models4   5 admin.site.register(models.UserType)6 admin.site.register(models.UserInfo)7 admin.site.register(models.UserGroup)8 admin.site.register(models.Asset)
View Code

 b、设置数据表名称

技术分享
1 class UserType(models.Model):2     name = models.CharField(max_length=50)3   4     class Meta:5         verbose_name = 用户类型6         verbose_name_plural = 用户类型
View Code

 c、打开表之后,设定默认显示,需要在model中作如下配置

技术分享
 1 from django.contrib import admin 2    3 from app01 import  models 4    5 class UserInfoAdmin(admin.ModelAdmin): 6     list_display = (username, password, email) 7    8    9 admin.site.register(models.UserType)10 admin.site.register(models.UserInfo,UserInfoAdmin)11 admin.site.register(models.UserGroup)12 admin.site.register(models.Asset)
View Code

 d、为数据表添加搜索功能

技术分享
 1 from django.contrib import admin 2    3 from app01 import  models 4    5 class UserInfoAdmin(admin.ModelAdmin): 6     list_display = (username, password, email) 7     search_fields = (username, email) 8    9 admin.site.register(models.UserType)10 admin.site.register(models.UserInfo,UserInfoAdmin)11 admin.site.register(models.UserGroup)12 admin.site.register(models.Asset)
View Code

 e、添加快速过滤

技术分享
 1 from django.contrib import admin 2    3 from app01 import  models 4    5 class UserInfoAdmin(admin.ModelAdmin): 6     list_display = (username, password, email) 7     search_fields = (username, email) 8     list_filter = (username, email) 9       10   11   12 admin.site.register(models.UserType)13 admin.site.register(models.UserInfo,UserInfoAdmin)14 admin.site.register(models.UserGroup)15 admin.site.register(models.Asset)
View Code

ajax请求

新url的方式:
点击---href跳转页面---对应函数(GET请求)---返回另一个html文件
---增加或编辑---form表单提交数据--函数中数据库更新(POST请求)---重定向

当客户端的添加或编辑按钮不经常使用时,没必要在页面开始加载时就将内容写入模态对话框,只需要在点击时触发一个ajax请求就可以获取数据
服务端接收ajax请求一般要进行try,except捕捉异常

为了防止读取数据库时间过长,用户体验不好,加上‘正在加载’的图片


模态对话框的方式:
点击---触发js事件---显示对话框(对话框中标签的内容可以是刚开始加载时就写好的,也可以是点击之后通过ajax请求得到的)
---增加或编辑---发送ajax请求---对应函数,更新数据库(POST请求)---返回字典---重新加载或报错

 

ajax请求:利用模态对话框处理浏览器请求时,为了防止form表单提交数据时自动刷新页面,采用ajax向后端发送数据
前端不会发生任何变化,数据处理结束后,后端给ajax返回一个字典,ajax根据字典来进行重新加载或报错

技术分享
 1 $.ajax({ 2         url:‘‘, #数据提交的地址 3         type: get/post, 4         data: {key1:value,key2:[],k3: JSON.stringify({k1:v1,...}}, #要发送的数据,可以是字符串或列表 5    dataType: JSON, #相当于json.parse(data) 将json字符串反序列化为jquery对象 6    traditional:true, #如果ajax提交的数据有列表,则要加上traditional:true, 7    success:function(data){ 8           if(data.status){ 9      location.reload(‘‘) #重新加载某页面10 11                location.href(/index.html?page=)+data.id   #利用ajax进行重定向12       }else{13       alert(data.message)} 14       })
View Code

 

Django框架基础(二)