zoukankan      html  css  js  c++  java
  • django-admin

    django 强大的一个地方就是在于它集成了一个非常方便的admin后台,我们只需要做简单的配置就可以实现一些强大的功能。所以接下来我们介绍下admin后台的使用

    model

    简单model

    先准备models.py文件 如下

     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页面,发现多了 标签选项

    现在对admin.py做一下添加

     @admin.register(Tag)
     class TagAdmin(admin.ModelAdmin):
         pass
    

    也就是仅仅将Tag model 注册到admin页面,在去观察admin页面,可以发现多了添加和修改按钮。

    接下来,我们添加Property model,按找Tag的方式注册完,发现并没有在User界面显示Property 相关的添加和查看,只能在Property中添加相应的用户,于是,我们引入inline,代码如下

     class PropertyInline(admin.StackedInline):
         model = Property
    
     @admin.register(User)
     class UserAdmin(admin.ModelAdmin):
         inlines = [PropertyInline, ]
         pass
    

    效果如下

    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
    
  • 相关阅读:
    Codeforces Round #169 (Div. 2) B. Little Girl and Game(博弈)
    Codeforces Round #167 (Div. 2) C. Dima and Staircase(线段树·成段更新,繁琐)
    Codeforces Round #170 (Div. 2) B. New Problem(好题)
    BKDR Hash Function
    DOC常用命令(转)
    C++ GUI Qt4 自学笔记
    windows如何取消开机启动项
    如何查看电脑配置
    Codeforces Round #166 (Div. 2)C. Secret(构造)
    Codeforces Round #168 (Div. 2) C. kMultiple Free Set(二分查找)
  • 原文地址:https://www.cnblogs.com/yuzhenjie/p/10395120.html
Copyright © 2011-2022 走看看