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
相关文章
相关标签/搜索