Bootstrap

Django 后台

后台的内容这里的介绍比较详细:
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

;