# admin界面设置
## Admin Site 管理界面
[官网](https://docs.djangoproject.com/en/3.0/ref/contrib/admin/)
### 最简单的
```
from django.contrib import admin
admin.site.register(models)
@admin.register(models.Model)
class MyModelAdmin(admin.ModelAdmin):
...
```
### [全局参数](https://docs.djangoproject.com/en/2.0/ref/contrib/admin/#adminsite-attributes)
```
admin.site.site_header = 'Django administration'
```
* `site_header`: 修改全局的标题,默认 `Django administration`
* `site_title`: 页面的title
### [ModelAdmin][ModelAdmin]:
* `list_display`: 在列表页面需要显示的字段数据
* `list_filter`: 在列表页面,可以进行分类查看的数据
* `list_per_page`: 默认100, 一页多少数据
* `list_select_related`: 哪些字段要通过join先查找出来,避免太多sql语句
* `search_fields`: 在列表页面的搜索框搜索的字段
* `readonly_fields`: 在详情页面,哪些字段只能读,不能写。一般用于auto_now_add 和 auto_now 的时间,以及id
* ### [get_readonly_fields](https://docs.djangoproject.com/en/2.0/ref/contrib/admin/#django.contrib.admin.ModelAdmin.get_readonly_fields)
看到[stackoverflow](https://stackoverflow.com/questions/7860612/django-admin-make-field-editable-in-add-but-not-edit)上的问题,如何自定义一个字段,创建的时候有,编辑的时候没有
```
def get_readonly_fields(self, request, obj=None):
if obj is None:
return []
else: return self.readonly_fields
```
* [fieldsets](https://docs.djangoproject.com/en/2.0/ref/contrib/admin/#django.contrib.admin.ModelAdmin.fieldsets)
```
class FlatPageAdmin(admin.ModelAdmin):
fieldsets = (
(None, {
'fields': ('url', 'title', 'content', 'sites')
}),
('Advanced options', {
'classes': ('collapse', 'wide', 'extrapretty'), # collapse会让几个字段默认隐藏
'fields': ('registration_required', 'template_name'),
'description': '描述',
}),
)
```
* ...
* [ ] `radio_fields`
* [autocomplete_fields][autocomplete_fields]
实现在添加Choice的时候,可以搜索question的`question_text`字段
为了防止数据的泄露。用户创建时,必须要有外键model的view和change权限
```
class QuestionAdmin(admin.ModelAdmin):
ordering = ['date_created']
search_fields = ['question_text'] # 必须能search才能autocomplete
class ChoiceAdmin(admin.ModelAdmin):
autocomplete_fields = ['question']
```
* [ ] `raw_id_fields`
* ...
### [InlineModelAdmin](https://docs.djangoproject.com/en/3.0/ref/contrib/admin/#inlinemodeladmin-objects)
```
from django.contrib import admin
class BookInline(admin.TabularInline):
model = Book
class AuthorAdmin(admin.ModelAdmin):
inlines = [
BookInline,
]
```
### [自定义]
* [自定义一个字段](#设置样式)
* [自定义缩略图](https://docs.djangoproject.com/en/2.0/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_display)
```python
from django.utils.html import format_html
class PersonAdmin(admin.ModelAdmin):
list_display = ('name', 'thumbnail')
def thumbnail(self, obj):
return format_html('
' % obj.avatar)
```
### [设置][setting]
* `has_add_permission(request)`: 能否添加
* `has_delete_permission(request, obj=None)`: 能否删除
### 设置样式
```python
class SampleAdmin(admin.ModelAdmin):
fieldsets = [
(None, {'fields': ['text']})
]
list_display = ('text','project')
list_filter = ['time','leve']
search_fields = ['text','project', 'get_users']
def get_users(self, obj): # 自定义一个字段
return obj.users.all()
get_users.short_description = '用户'
admin.site.register(, SampleAdmin)
```
## Admin actions
```
from django.contrib import admin
from myapp.models import Article
@admin.action(description="Mark selected stories as published")
def make_published(modeladmin, request, queryset):
queryset.update(status="p")
class ArticleAdmin(admin.ModelAdmin):
list_display = ["title", "status"]
ordering = ["title"]
actions = [make_published]
admin.site.register(Article, ArticleAdmin)
```
## Admin documentation generator
[ModelAdmin]: https://docs.djangoproject.com/en/4.0/ref/contrib/admin/#modeladmin-objects
[autocomplete_fields]: https://docs.djangoproject.com/en/4.0/ref/contrib/admin/#django.contrib.admin.ModelAdmin.autocomplete_fields
[setting]: https://docs.djangoproject.com/en/5.1/ref/contrib/admin/#django.contrib.admin.InlineModelAdmin.has_add_permission