django-admin

django 強大的一個地方就是在於它集成了一個很是方便的admin後臺,咱們只須要作簡單的配置就能夠實現一些強大的功能。因此接下來咱們介紹下admin後臺的使用python

model

簡單model

先準備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

仍是先看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

fileds

列表頁

默認的列表頁顯示的是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)

filter

當須要對列表頁作篩選的時候,咱們能夠經過添加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

在界面上的這個位置,用來對列表頁進行批量操做,默認了一個刪除的action。

  • 編寫本身的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]
  • 根據權限控制action的顯示
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
相關文章
相關標籤/搜索