Django框架基础

Posted 柳姑娘

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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_key
10         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=True
54     )
字段
 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=True
14     )
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_id
11 1   1        别比比    root         null
12 2   1        就比比    root         null
13 3   1        瞎比比    shaowei      null
14 4   2        写的正好  root         null
15 5   1        拉倒吧    由清滨         2
16 6   1        拉倒吧1    xxxxx         2
17 7   1        拉倒吧2    xxxxx         5
18 """
19 """
20 新闻1
21     别比比
22     就比比
23         - 拉倒吧
24             - 拉倒吧2
25         - 拉倒吧1
26     瞎比比
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 admin
2   
3 from app01 import  models
4   
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以上是关于Django框架基础的主要内容,如果未能解决你的问题,请参考以下文章

web框架之--Django基础入门

Django基础篇

Django基础

01.Django-基础

python django基础

01-Django-基础篇-Web框架简介