Django 后台

来源:互联网 发布:网站显示apache tomcat 编辑:程序博客网 时间:2024/05/22 17:35

后台的内容这里的介绍比较详细:
https://django-intro-zh.readthedocs.io/zh_CN/latest/part2/#_3

1. 在app里面修改admin.py

#引入models里面的哪个类并进行注册,就能在后台管理哪个类了from django.contrib import adminfrom .models import Articleadmin.site.register(Article)

定义 Model 的时候 写一个 unicode 函数(或 str函数)来保证后台显示的时候不是显示object而是直接显示名字

2. 在列表显示与字段相关的其它内容,添加搜索,筛选功能

#list_display来挑选要显示出来的字段,要新建一个继承自admin.ModelAdmin的类来承载from django.contribute import adminfrom .models import Articleclass 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 adminfrom .models import Article, Personclass 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 adminclass 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 adminclass 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 adminclass 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 adminclass 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

原创粉丝点击