django 強大的一個地方就是在於它集成了一個很是方便的admin後臺,咱們只須要作簡單的配置就能夠實現一些強大的功能。因此接下來咱們介紹下admin後臺的使用python
先準備models.py文件 以下django
from django.db import models # Create your models here. class User(models.Model): GENDER = ((0, "未知"), (1, "男"), (2, "女")) name = models.CharField('名字', max_length=256) gender = models.IntegerField("性別", choices=GENDER, default=0) def __str__(self): return self.name class Meta: verbose_name = '用戶' db_table = 'user'
而後,咱們能夠根據model 準備admin.py的代碼了,簡單示例以下安全
from django.contrib import admin from .models import * @admin.register(User) class UserAdmin(admin.ModelAdmin): pass
python manage.py createsuperuser
/admin/
用建立的用戶名密碼登陸,能夠看到咱們註冊的model仍是先看model文件測試
from django.db import models # Create your models here. class Tag(models.Model): name = models.CharField(max_length=20) class Meta: verbose_name = "標籤" class User(models.Model): GENDER = ((0, "未知"), (1, "男"), (2, "女")) name = models.CharField('名字', max_length=256) phone = models.CharField('手機', max_length=40, null=True) gender = models.IntegerField("性別", choices=GENDER, default=0) tag = models.ForeignKey(Tag, verbose_name="標籤", on_delete=models.CASCADE) def __str__(self): return self.name class Meta: verbose_name = '用戶' db_table = 'user' class Property(models.Model): user = models.ForeignKey(User, verbose_name="用戶", on_delete=models.CASCADE) context = models.CharField('內容', max_length=200) def __str__(self): return self.context class Meta: verbose_name = "用戶屬性"
而後咱們查看 admin頁面,發現多了 標籤選項
ui
如今對admin.py作一下添加url
@admin.register(Tag) class TagAdmin(admin.ModelAdmin): pass
也就是僅僅將Tag model 註冊到admin頁面,在去觀察admin頁面,能夠發現多了添加和修改按鈕。
3d
接下來,咱們添加Property
model,按找Tag的方式註冊完,發現並無在User界面顯示Property 相關的添加和查看,只能在Property中添加相應的用戶,因而,咱們引入inline,代碼以下code
class PropertyInline(admin.StackedInline): model = Property @admin.register(User) class UserAdmin(admin.ModelAdmin): inlines = [PropertyInline, ] pass
效果以下
orm
默認的列表頁顯示的是model的__str__
值,咱們能夠本身定義,並添加多列的值來顯示,也能夠本身定義顯示的內容等,具體內容看下面代碼對象
from django.utils.safestring import mark_safe @admin.register(User) class UserAdmin(admin.ModelAdmin): # 列表頁顯示自定義字段 def url_test(self, obj): # return '自定義的文字' # 若是須要加上樣式,或顯示圖片等,須要將字段標記成安全的,以下: return mark_safe('<a href=#>url</a>') url_test.short_description = "連接測試" list_per_page = 20 # 每頁顯示數量 list_display = ('id', 'name', 'phone''gender', 'url_test') # 列表頁顯示哪些列的數據,第一個字段會自動生成連接,指像該對象的詳情頁 list_editable = ('gender', ) # 在列表頁能夠編輯的字段
效果以下
默認是顯示全部的字段,咱們也能夠按照本身的需求添加和修改,代碼以下
@admin.register(User) class UserAdmin(admin.ModelAdmin): # 自定義顯示字段的方式和列表頁相同 # 只讀字段,注意自定義顯示的字段必須標記爲readonly readonly_fields = ('id', 'name', 'url_test') # 要顯示的字段順序,能夠分組顯示 fields = (('id', 'name'), 'phone', 'gender', 'url_test' )
有時,咱們須要本身定義表單提交的內容,好比說,咱們須要將圖片傳到雲上,將返回的url保存到對應的字段,由於該字段爲CharField,因此咱們須要一個上傳文件的地方,因而引入了form
class ImageForm(ModelForm): pic = FileField(required=False, label="圖片") class Meta: model = Image fields = "__all__" @admin.register(User) class UserAdmin(admin.ModelAdmin): list_per_page = 20 form = ImageForm def save_model(self, request, obj, form, change): request.files = request.FILES pic = image_upload(request, "pic") # 上傳圖片至雲,返回url obj.pic = pic[0] if pic else obj.pic return super().save_model(request, obj, form, change)
當須要對列表頁作篩選的時候,咱們能夠經過添加list_filter
的字段實現,也能夠本身定義相關的操做,代碼以下
class CategoryFilter(admin.SimpleListFilter): title = _('分類') # 顯示的名字 parameter_name = 'category' # url中的字段 def lookups(self, request, model_admin): # url查找的值,和其對應的顯示出來的值 return ( ('80s', _('in the eighties')), ('90s', _('in the nineties')), ) def queryset(self, request, queryset): # 咱們本身處理的傳過來的值的過程 if self.value(): id_ = int(self.value()) if id_: return queryset.filter(category=id_) @admin.register(User) class UserAdmin(admin.ModelAdmin): list_filter = ('gender', CategoryFilter) # 搜索字段的添加 search_fields = ("name", "phone")
在界面上的這個位置,用來對列表頁進行批量操做,默認了一個刪除的action。
def send_note_msg(self, request, queryset): error = '' resoult = '' for obj in queryset: phone = obj.tel txt = "短信內容 " if sendMsg(phone, txt): resoult += u'發送{}成功!'.format(obj.id) obj.is_send_msg = True obj.save() else: error += u'發送{}失敗,相關信息不完整,mast need phone, event_name, delivery_num'.format(obj.id) # 通知哪些發送成功,哪些發送失敗 self.message_user(request, resoult, level=messages.SUCCESS) self.message_user(request, error, level=messages.ERROR) # action顯示的名稱 send_note_msg.short_description = '發送短信提示' # 添加action actions=[send_note_msg]
def get_actions(self, request): actions = super(GuestTmpAdmin, self).get_actions(request) if 'guest.delete_guest' not in request.user.get_group_permissions(): del actions["send_note_msg"] return actions