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代码:

 

学习是一种态度,坚持是质变的利器!
posted @ 2018-03-11 22:47  dion至君  阅读(145)  评论(0)    收藏  举报