django_admin的定制
一:之前django orm的补充:
我们在创建model对象的时候,之前的创建语句:
models.User.objects.create(name='xx')
这种创建方法,直接插入数据库中。
根据orm的里面,code first的原理,我们可以创建一个model对象,然后通过modle对象的save方法,来将python对象写入数据库中。
1 from checkadmin import models 2 obj=models.Author(name='evil') 3 obj.save()
步骤2:只是创建model对象,此时该对象并没有插入数据库。
步骤3:调用save()方法的时候,才是真正的写入数据库中。详细可以参考:http://www.cnblogs.com/alex3714/articles/5457672.html
二:django admin的定制:
需要做如下操作:
a:在url.py配置文件,添加对应的admin url。
1 url(r'^admin/', admin.site.urls),#注意逗号
b:对应的app下admin.py进行我们需要注册modle。
1 from django.contrib import admin 2 from checkadmin import models 3 # Register your models here. 4 5 admin.site.register(models.Author) 6 admin.site.register(models.Book)
c:建立对应的超级用户:
1 python.exe manage.py createsuperuser
d:建立相应model:
1 from django.db import models 2 3 # Create your models here. 4 class Book(models.Model): 5 name=models.CharField(max_length=32) 6 author=models.ForeignKey('Author') 7 class Meta: 8 verbose_name='图书' 9 verbose_name_plural='图书' 10 def __str__(self): 11 return self.name 12 13 14 class Author(models.Model): 15 name=models.CharField(max_length=32) 16 age=models.IntegerField(default='22') 17 class Meta: 18 verbose_name='作者' 19 verbose_name_plural='作者'#如果不设置这个属性,只设置上面属性的话,会出现作者s 后面加s的情况。 20 def __str__(self):#输出对象的时候,显示的是对象的名字属性 21 return self.name
e:自定义显示我们想要的字段:
现在显示的字段:
那如何显示更多字段呢?比如说:作者的年龄呢?可以在admin.py 建立相应的类来实现。如下:
需要做如下操作:在admin.py里写对应的类。
1:需要写自定义类:
1 class Author_admin(admin.ModelAdmin):#需要继承admin.ModelAdmin
2 list_display = ('age','name')#元组内需要写显示的字段。
2:需要找到,之前的你想要哪个model的注册,并添加到对应的注册中:
1 admin.site.register(models.Author,Author_admin)#需要找到对应之前注册的model写入我们之前的类:Author_admin 2 admin.site.register(models.Book)
这样就可以显示我们的需要显示的字段了。
注意:如果多对多字段的话,不显示,因为一行的对象会匹配多个另一张表的对象,一行显示会出现问题。
扩展用法:
a:添加搜索框:
只需要在admin.py里之前定义的类中定义:search_fields字段即可。
1 class Author_admin(admin.ModelAdmin):#需要继承admin.ModelAdmin
2 list_display = ('name','age')#元组内需要写显示的字段。
3 search_fields = ('name','age')#定义搜索框
b:定义过滤功能:
需要在admin.py里之前定义类中添加字段:list_filter即可
1 from django.contrib import admin
2 from checkadmin import models
3 # Register your models here.
4 class Author_admin(admin.ModelAdmin):#需要继承admin.ModelAdmin
5 list_display = ('name','age')#元组内需要写显示的字段。
6 search_fields = ('name','age')#定义搜索框
7 list_filter = ('name',)#显示左侧搜索的功能栏
c:数据库列出的字段可以进行编辑状态,可以用:list_editable就可以进行实现。
class Author_admin(admin.ModelAdmin):#需要继承admin.ModelAdmin
list_display = ('id','name','age')#元组内需要写显示的字段。
search_fields = ('name','age')#定义搜索框
list_filter = ('name',)#显示左侧搜索的功能栏
list_editable = ('name','age')#name和age字段可以进行编辑。
需要注意的是:需要显示id列,如果你想让name可编辑的话,因为在django admin中,首列默认是不可以编辑的。所以要显示比如id。
d:django也可以进行分页操作:list_per_page字段。
1 class Author_admin(admin.ModelAdmin):#需要继承admin.ModelAdmin
2 list_display = ('id','name','age')#元组内需要写显示的字段。
3 search_fields = ('name','age')#定义搜索框
4 list_filter = ('name',)#显示左侧搜索的功能栏
5 list_editable = ('name','age')
6 list_per_page = 1#每页显示1行数据。
e:对django admin的内部添加数据的定制化。
比如在多对多的情况下。在给多对多一列进行添加的时候,如果对应的对象是多个话,手动点击的话,比较耗时。
使用字段:filter_horizontal可以进行全部的添加和删除。
f:给action 添加下拉标签:
代码:
1 class Author_admin(admin.ModelAdmin):#需要继承admin.ModelAdmin
2 list_display = ('id','name','age')#元组内需要写显示的字段。
3 search_fields = ('name','age')#定义搜索框
4 list_filter = ('name',)#显示左侧搜索的功能栏
5 list_editable = ('name','age')
6 list_per_page = 1#每页显示1行数据。
7
8 actions = ('book_choice',)
9 def book_choice(self):
10 pass
g:如上下拉框进行中文的显示。可用字段:short_description
class Author_admin(admin.ModelAdmin):#需要继承admin.ModelAdmin list_display = ('id','name','age')#元组内需要写显示的字段。 search_fields = ('name','age')#定义搜索框 list_filter = ('name',)#显示左侧搜索的功能栏 list_editable = ('name','age') list_per_page = 1#每页显示1行数据。 actions = ('book_choice',)#创建下拉框。 def book_choice(self): pass #可以对这个action 做个中文描述。 book_choice.short_description = "图书选择"
效果:
对于action功能的题外话:
当我们勾选下面的选项,选择我们定义的action:图书选择,点击GO的时候,我们可以给GO绑定一个我们自定义函数,如上我们设置action的函数的时候直接pass。现在我们添加一点功能。
代码如下:
1 class Author_admin(admin.ModelAdmin):#需要继承admin.ModelAdmin 2 list_display = ('id','name','age')#元组内需要写显示的字段。 3 search_fields = ('name','age')#定义搜索框 4 list_filter = ('name',)#显示左侧搜索的功能栏 5 list_editable = ('name','age') 6 list_per_page = 1#每页显示1行数据。 7 8 actions = ('book_choice',)#创建下拉框。 9 def book_choice(self,*args):##注意action中只能传一个参数。否则会报错,参数过长 10 print(*args)#打印他们的参数。 11 return redirect('https:///www.baidu.com') 12 #可以对这个action 做个中文描述。 13 book_choice.short_description = "图书选择"
效果是点击GO图标的时候,直接跳到百度首页。
GO是一个提交按钮,它在一个表单内。点击就提交当前的选择的数据和请求。我们打印我们参数如下:
1 <WSGIRequest: POST '/admin/checkadmin/author/'> <QuerySet [<Author: tom>]>
html代码:


浙公网安备 33010602011771号