# Admin站點
### Admin站點
```text
創建項目模板,默認Admin被啟用:python manage.py startproject project醒目
創建管理員的用戶名和密碼:python manage.py createsuperuser
按照提示填寫信息
在應用內admin.py文件完成注冊,就可以在后臺管理中維護模型的數據
from django.contrib import admin
from models import *
admin.site.register(Students)
查找admin文件:在INSTALLED_APPS項中加入django.contrib.admin,Django就會自動搜索每個應用的admin模塊并將其導入
```
## ModelAdmin對象
* ModelAdmin類是模型在Admin界面中的表示形式
* 定義:定義一個類,繼承于admin.ModelAdmin,注冊模型時使用這個類
```text
class StudentsAdmin(admin.ModelAdmin):
def gender(self):
if self.sgender:
return "男"
else:
return "女"
# 設置頁面列的名稱
gender.short_description = "性別"
list_display = ['pk','sname','sage',gender,'scontend','sgrade','isDelete']
list_per_page = 10
```
* 通常定義應用的admin.py文件里
* 使用方式一:注冊參數
```text
admin.site.register(Students,StudentsAdmin)
```
* 使用方式二:注冊裝飾器
```text
from myapp.models import Students
@admin.register(Students)
class StudentsAdmin(admin.ModelAdmin):
```
* 通過重寫admin.ModelAdmin的屬性規定顯示效果,屬性主要分為列表頁,增加修改頁兩部分
## 列表頁選項
### “操作選項”的位置
* actions\__on\_top、actions\_on\_bottom:默認顯示在頁面的頂部_
```text
# 執行動作的位置
# 在底部
actions_on_bottom = True
actions_on_top = True
```
### list\_display
* 出現列表中的顯示字段
* 列表類型
* 在列表中,可以是字段名稱,也可以是方法名稱,但是方法名稱默認不能排序
* 在方法中可以使用format\_html\(\)輸出HTML內容
```text
admin.py
from django.contrib import admin
# Register your models here.
from .models import Grades,Students
# 注冊
class StudentsInfo(admin.TabularInline):
model = Students
extra = 2
# class StudentsInfo(admin.StackedInline):
# model = Students
# extra = 2
@admin.register(Grades)
class GradesAdmin(admin.ModelAdmin):
inlines = [StudentsInfo]
# 列表頁屬性
list_display = ['pk','gname','gdate','ggirlnum','gboynum','isDelete']
list_filter = ['gname']
search_fields = ['gname']
list_per_page = 5
# # 添加、修改頁屬性
# fields = ['ggirlnum','gboynum','gname','gdate','isDelete']
fieldsets = [
("num",{"fields":['ggirlnum','gboynum']}),
("base",{"fields":['gname','gdate','isDelete']}),
]
# admin.site.register(Grades,GradesAdmin)
@admin.register(Students)
class StudentAdmin(admin.ModelAdmin):
def gender(self):
if self.sgender:
return "男"
else:
return "女"
# 設置頁面列的名稱
gender.short_description = "性別"
list_display = ['pk','sname','sage',gender,'scontend','sgrade','isDelete']
list_per_page = 10
# 執行動作的位置
# 在底部
actions_on_bottom = True
actions_on_top = False
# admin.site.register(Students,StudentAdmin)
from .models import Text
admin.site.register(Text)
models.py
from django.db import models
# Create your models here.
# 班級》學生 ,一對多
# 類里面的屬性,對應數據庫中表的字段
class Grades(models.Model):
gname = models.CharField(max_length=20)
gdate = models.DateField()
ggirlnum = models.IntegerField()
gboynum = models.IntegerField()
isDelete = models.BooleanField(default=False)
# 重寫str
def __str__(self):
# return "%s-%d-%d" % (self.gname,self.ggirlnum,self.gboynum)
return self.gname
class StudentsManager(models.Manager):
def get_queryset(self):
return super(StudentsManager,self).get_queryset().filter(isDelete=False)
def createStudent(self,name,age,gender,contend,grade,isDel=False):
stu = self.model()
# print(type(stu))
stu.sname = name
stu.sage = age
stu.sgender = gender
stu.scontend = contend
stu.sgrade = grade
return stu
class Students(models.Model):
# 定義一個類方法創建對象
# cls代表了Students類
@classmethod
def createStudent(cls,name,age,gender,contend,grade,isDel=False):
stu = cls(
sname = name,
sage = age,
sgender = gender,
scontend = contend,
sgrade = grade,
isDelete = isDel,
)
return stu
# 自定義模型管理器
# 當自定義模型管理器,objects就不存在了
# stuObj = models.Manager()
# stuObj2 = StudentsManager()
sname = models.CharField(max_length=20)
sgender = models.BooleanField(default=False)
sage = models.IntegerField()
scontend = models.CharField(max_length=20)
isDelete = models.BooleanField(default=False)
# 關聯外鍵
sgrade = models.ForeignKey("Grades",on_delete=models.CASCADE)
def __str__(self):
return self.sname
def getName(self):
return self.sname
# class TempTables(models.Model):
# a = models.BooleanField(default=True)
from tinymce.models import HTMLField
class Text(models.Model):
str = HTMLField()
```
* 讓方法排序,為方法指定admin\__order\_filed屬性:_
```text
在models.py中為Students類增加方法orderName
def orderName(self):
return format(self.sname)
orderName.admin_order_filed = 'sname'
```
* 標題欄名稱:將字段封裝成方法,為方法設置short\_description屬性
```text
@admin.register(Students)
class StudentsAdmin(admin.ModelAdmin):
def gender(self):
if self.sgender:
return "男"
else:
return "女"
def getName(self):
return self.sname
getName.short_description = "姓名"
list_display = ['pk', getName, 'sage', gender,]
```
### list\_filter
* 右側欄過濾器,對那些屬性的值進行過濾
* 列表類型
* 只能接受字段
```text
@admin.register(Students)
class StudentsAdmin(admin.ModelAdmin):
.....
list_filter = ('sname','sage')
```
### list\_per\_page
* 每頁中顯示多少項,默認設置為100
```text
from django.contrib import admin
# Register your models here.
from myapp.models import Students, Grades
@admin.register(Students)
class StudentsAdmin(admin.ModelAdmin):
.....
list_per_page = 10
```
### search\_fileds
* 搜索框
* 列表類型,表示在這些字段上進行搜索
* 只能接收字段
```text
class StudentsAdmin(admin.ModelAdmin):
...
search_fields = ['sname']
```
* fieldsets:分組顯示
```text
class StudentsAdmin(admin.ModelAdmin):
...
fieldsets = (
('base',{'fields':('sname','sage')}),
('main',{'fields':('sgender','scontend')}),
)
```
* fields與fieldsets兩者選一
### 設置可點擊鏈接進入編輯頁面
```text
list_display_links = ('sname','sage')
```
### 詳細時間分層篩選
* date\_hierarchy
```text
date_hierarchy = 'date'
```
### InlineModelAdmin對象
* 類型InlineModelAdmin:表示在模型的添加或修改頁面嵌入關聯模型的添加或修改
* 子類TabularInline:以表格的形式嵌入
* 子類StackedInline:以塊的形式嵌入
```text
class StudentsInline(admin.TabularInline):
model = Students
class GradesAdmin(admin.ModelAdmin):
inlines = [
StudentsInline,
]
admin.site.register(Grades,GradesAdmin)
```
### 重寫admin模板
* 在項目所在目錄中創建templates目錄,再創建一個admin目錄
* 設置模板查找目錄:修改settings.py的TEMPLATES項,加載模板時會在DIRS列表指定目錄中搜索
```text
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR,'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
```
* 從django安裝的目錄下\(django/contrib/admin/templates\)將模板頁面的源文件admin/base\_site.html拷貝到第一步創建好的目錄中
* 編輯base\_site.html文件
* 刷新頁面,查看效果
* 其他管理后臺的模板可以按照相同的方式進行修改
```text
base_site.html
{% extends 'admin/base.html' %}
{% block title %}
{{ title }} |{{ site_title|default:_('Django site admin') }}
{% endblock %}
{% block branding %}
<h1 di="site-name"><a href="{% url 'admin:index' %}">學生管理系統</a></h1>
{% endblock %}
{% block nav-global %}
{% endblock %}
```