【Django】admin小技巧总结(九)

admin设置中文

HelloWorld/HelloWorld/settings.py下,然后把这个en-us改成zh-Hans就课可以设置成中文了

LANGUAGE_CODE = 'zh-Hans'

调整页面头部显示内容和页面标题

admin.site.site_header = '修改后'
admin.site.site_title = '哈哈'

通过当前登录的用户过滤显示的数据

@admin.register(Book)
class BookAdmin(admin.ModelAdmin):
    def get_queryset(self, request):
        """函数作用:使当前非超级用户,只能看到《张三的幸福生活》"""
        qs = super(BookAdmin, self).get_queryset(request)
        if request.user.is_superuser:
            return qs
        return qs.filter(title='张三的幸福生活')
    search_fields = ('author', 'title')
    list_display = ['id', 'author', 'title']
    list_display_links = ('id', 'author', 'title')
    list_filter = ('author', 'title')
    list_per_page = 20
    ordering = ('-id',)
    fields = ('author', 'title')

设置只读字段

在使用admin的时候,ModelAdmin默认对于model的操作只有增加,修改和删除,但是总是有些字段是不希望用户来编辑的。而 readonly_fields 设置之后不管是admin还是其他用户都会变成只读,而我们通常只是想限制普通用户。 这时我们就可以通过重写 get_readonly_fields 方法来实现对特定用户的只读显示。

@admin.register(Book)
class BookAdmin(admin.ModelAdmin):
    def get_queryset(self, request):
        """函数作用:使当前非超级用户,只能看到《张三的幸福生活》"""
        qs = super(BookAdmin, self).get_queryset(request)
        if request.user.is_superuser:
            return qs
        return qs.filter(title='张三的幸福生活')

    def get_readonly_fields(self, request, obj=None):
        """  重新定义此函数,限制普通用户所能修改的字段  """
        if request.user.is_superuser:
            self.readonly_fields = []
        return self.readonly_fields

    readonly_fields = ('title',)
    search_fields = ('author', 'title')
    list_display = ['id', 'author', 'title']
    list_display_links = ('id', 'author', 'title')
    list_filter = ('author', 'title')
    list_per_page = 20
    ordering = ('-id',)
    fields = ('author', 'title')

书名变成了自读字段,无法编辑

修改模版 chang_form.html 让普通用户 无法看到 “历史” 按钮。

修改app的显示名称

在django1.7版本之后,只需要在app的__init__.py 文件修改如下:

from django.apps import AppConfig
import os

default_app_config = 'TestModel.PrimaryBlogConfig'

VERBOSE_APP_NAME = '哈喽你好'


def get_current_app_name(_file):
    return os.path.split(os.path.dirname(_file))[-1]


class PrimaryBlogConfig(AppConfig):
    name = get_current_app_name(__file__)
    verbose_name = VERBOSE_APP_NAME

models按注册顺序排序

Django的admin管理后台一直是一个很强大的工具,但是有一个让人很不爽的地方就是model列表的显示顺序是按model名字来的,如果是英文按字母顺序还比较好找,如果是中文则是完全无序了,一个app下的model一多就会比较难找要修改的model。

from django.contrib import admin
from django.utils.text import capfirst
from collections import OrderedDict as SortedDict


def find_model_index(name):
    count = 0
    for model, model_admin in admin.site._registry.items():
        if capfirst(model._meta.verbose_name_plural) == name:
            return count
        else:
            count += 1
    return count


def index_decorator(func):
    def inner(*args, **kwargs):
        template_response = func(*args, **kwargs)
        for app in template_response.context_data['app_list']:
            app['models'].sort(key=lambda x: find_model_index(x['name']))
        return template_response

    return inner


registry = SortedDict()
registry.update(admin.site._registry)
admin.site._registry = registry
admin.site.index = index_decorator(admin.site.index)
admin.site.app_index = index_decorator(admin.site.app_index)

修改model操作权限

只读权限

class ReadOnlyModelAdmin(admin.ModelAdmin):
    """ModelAdmin class that prevents modifications through the admin.

    The changelist and the detail view work, but a 403 is returned
    if one actually tries to edit an object.
    """

    actions = None

    def get_readonly_fields(self, request, obj=None):
        return self.fields or [f.name for f in self.model._meta.fields]

    def has_add_permission(self, request):
        return False

    # Allow viewing objects but not actually changing them
    def has_change_permission(self, request, obj=None):
        if request.method not in ('GET', 'HEAD'):
            return True
        return super(ReadOnlyModelAdmin, self).has_change_permission(request, obj)

    def has_delete_permission(self, request, obj=None):
        return False

无任何权限

class ReadAndDeleteModelAdmin(admin.ModelAdmin):
    """ModelAdmin class that prevents modifications through the admin.

    The changelist and the detail view work, but a 403 is returned
    if one actually tries to edit an object.
    """

    actions = None

    def get_readonly_fields(self, request, obj=None):
        return self.fields or [f.name for f in self.model._meta.fields]

    def has_add_permission(self, request):
        return False

    # Allow viewing objects but not actually changing them
    def has_change_permission(self, request, obj=None):
        if request.method not in ('GET', 'HEAD'):
            return True
        return super(ReadAndDeleteModelAdmin, self).has_change_permission(request, obj)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值