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)