Django基础(四):admin

2017-10-17  本文已影响11人  宇辰星君

**### 兼容python2.x和python3.x

# coding:utf-8
from __future__ import unicode_literals
 
from django.db import models
from django.utils.encoding import python_2_unicode_compatible
 
@python_2_unicode_compatible
class Article(models.Model):
    title = models.CharField('标题', max_length=256)
    content = models.TextField('内容')
 
    pub_date = models.DateTimeField('发表时间', auto_now_add=True, editable = True)
    update_time = models.DateTimeField('更新时间',auto_now=True, null=True)
 
    def __str__(self):
        return self.title
# 将python2支持的__unicode__换成python3支持的__str__,否则报以下错误:
ValueError: @python_2_unicode_compatible cannot be applied to Article because it doesn't define __str__().

python_2_unicode_compatible 会自动做一些处理去适应python不同的版本,本例中的 unicode_literals 可以让python2.x 也像 python3 那个处理 unicode 字符,以便有更好地兼容性,这里代码中是python3.x的代码。

在列表显示与字段相关的其它内容

如果我们还需要显示一些其它的fields,如何做呢?
list_display 就是来配置要显示的字段的,当然也可以显示非字段内容,或者字段相关的内容

# models.py
# coding:utf-8
from __future__ import unicode_literals
from django.db import models
from django.utils.encoding import python_2_unicode_compatible
# Create your models here.
@python_2_unicode_compatible
class Article(models.Model):
    title = models.CharField(u'标题', max_length=256)
    content = models.TextField(u'内容')
    pub_date = models.DateTimeField(u'发表时间', auto_now_add=True, editable = True)
    update_time = models.DateTimeField(u'更新时间',auto_now=True, null=True)
    #def __unicode__(self): python 2
    def __str__(self):  # __str__ on Python 3
        return self.title
class Student(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)
# admin.py
class ArticleAdmin(admin.ModelAdmin):
    list_display = ('title','pub_date','update_time',)
class StudentAdmin(admin.ModelAdmin):
    list_display = ('full_name',)
admin.site.register(Article,ArticleAdmin)
admin.site.register(Student,StudentAdmin)

完善 django admin site

  1. 定制加载的列表, 根据不同的人显示不同的内容列表,比如输入员只能看见自己输入的,审核员能看到所有的草稿,这时候就需要重写get_queryset方法,该类实现的功能是如果是超级管理员就列出所有的,如果不是,就仅列出访问者自己相关的。
# admin.py
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)

2.定制搜索功能

# admin.py
# 按照name在admin site搜索,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

3.修改保存时的一些操作,可以检查用户,保存的内容等,比如保存时加上添加人

# admin.py
# 其中obj是修改后的对象,form是返回的表单(修改后的)
# 如果原来的obj不存在,也就是如果我们是新建的一个怎么办呢,这时候可以用try,except的方法尝试获取,当然更好的方法是判断一下这个对象是新建还是修改,是新建就没有 obj_original,是修改就有
class ArticleAdmin(admin.ModelAdmin):
    list_display = ('title','pub_date','update_time',)
    def save_model(self, request, obj, form, change):
        if change:# 当修改一个对象时 change = True
            obj_original = self.model.objects.get(pk=obj.pk)
        else:# 当新建一个对象时 change = False
            obj_original = None
        obj.user = request.user
        obj.save()
  1. 删除时做处理
    def delete_model(self, request, obj):
        """
        Given a model instance delete it from the database.
        """
        # handle something here
        obj.delete()

其它一些常用的功能:

搜索功能:search_fields = ('title', 'content',) 这样就可以按照 标题或内容搜索了
https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.search_fields
筛选功能:list_filter = ('status',) 这样就可以根据文章的状态去筛选,比如找出是草稿的文章
https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_filter
新增或修改时的布局顺序:
https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.fieldsets**

上一篇下一篇

猜你喜欢

热点阅读