后台的内容这里的介绍比较详细:
https://django-intro-zh.readthedocs.io/zh_CN/latest/part2/#_3
1. 在app里面修改admin.py
#引入models里面的哪个类并进行注册,就能在后台管理哪个类了
from django.contrib import admin
from .models import Article
admin.site.register(Article)
定义 Model 的时候 写一个 unicode 函数(或 str函数)来保证后台显示的时候不是显示object而是直接显示名字
2. 在列表显示与字段相关的其它内容,添加搜索,筛选功能
#list_display来挑选要显示出来的字段,要新建一个继承自admin.ModelAdmin的类来承载
from django.contribute import admin
from .models import Article
class ArticleAdmin(admin.ModelAdmin):
list_display = ('title','pub_date','update_time',)
#搜索功能:search_fields,可以按照 标题或内容搜索
search_fields = ('title','content')
筛选功能:list_filter 根据文章的发布时间去筛选
list_filter = ('pub_date')
admin.site.register(Article,ArticleAdmin)
#也可以用来显示非字段内容,或者字段相关的内容
class Person(models.Model):
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
def my_property(self):
return self.first_name + ' ' + self.last_name
my_property.short_description = "Full name of the person"
full_name = property(my_property)
from django.contrib import admin
from .models import Article, Person
class ArticleAdmin(admin.ModelAdmin):
list_display = ('title', 'pub_date', 'update_time',)
class PersonAdmin(admin.ModelAdmin):
list_display = ('full_name',)
admin.site.register(Article, ArticleAdmin)
admin.site.register(Person, PersonAdmin)
3. 自定义管理页面样式
https://django-intro-zh.readthedocs.io/zh_CN/latest/part2/#_9
4. 自定义后台特殊需求的功能
#定制加载的列表, 根据不同的人显示不同的内容列表,比如输入员只能看见自己输入的,审核员能看到所有的草稿,这时候就需要重写get_queryset方法
#该类实现的功能是如果是超级管理员就列出所有的,如果不是,就仅列出访问者自己相关的
class MyModelAdmin(admin.ModelAdmin):
def get_queryset(self,request):
qs = super(MyModelAdmin, self).get_queryset(request)
if request.user.is_superuser:
return qs
else:
return qs.filter(author=request.user)
#定制搜索功能(django 1.6及以上才有)
#queryset 是默认的结果,search_term 是在后台搜索的关键词
class PersonAdmin(admin.ModelAdmin):
list_display = ('name', 'age')
search_fields = ('name')
def get_search_results(self,request,queryset,search_term):
queryset,use_distinct = super(PersonAdmin, self).get_search_results(request,queryset,search_term)
try:
search_term_as_int = int(search_term)
queryset |= self.model.objects.filter(age=search_term_as_int)
except:
pass
return queryset, use_distinct
#修改保存时的一些操作,可以检查用户,保存的内容等,比如保存时加上添加人
from django.contrib import admin
class ArticleAdmin(admin.ModelAdmin):
def save_model(self,request,obj,form,change):
obj.user = request.user
obj.save()
#其中obj是修改后的对象,form是返回的表单(修改后的),当新建一个对象时 change = False, 当修改一个对象时 change = True
#如果需要获取修改前的对象的内容可以用
from django.contrib import admin
class ArticleAdmin(admin.ModelAdmin):
def save_model(self, request, obj, form, change):
obj_original = self.model.objects.get(pk=obj.pk)
obj.user = request.user
obj.save()
#那么又有问题了,这里如果原来的obj不存在,也就是如果我们是新建的一个怎么办呢,这时候可以用try,except的方法尝试获取,当然更好的方法是判断一下这个对象是新建还是修改,是新建就没有 obj_original,是修改就有
from django.contrib import admin
class ArticleAdmin(admin.ModelAdmin):
def save_model(self, request, obj, form, change):
if change:# 更改的时候
obj_original = self.model.objects.get(pk=obj.pk)
else:# 新增的时候
obj_original = None
obj.user = request.user
obj.save()
#删除时做一些处理
from django.contrib import admin
class ArticleAdmin(admin.ModelAdmin):
def delete_model(self, request, obj):
"""
Given a model instance delete it from the database.
"""
# handle something here
obj.delete()
好困啊
推荐阅读:
http://code.ziqiangxuetang.com/django/django-admin.html