zoukankan      html  css  js  c++  java
  • django admin

    Django admin使用

    admin app

    Django提供了基于web的管理工具

    django自动管理工具是django.contrib的一部分,你可以在项目中settings.py中INSTALLED_APP中看到它。

    setings.py中

    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        "app01"
    ]

    django.contrib是一套庞大的功能集,它是django代码的基本组成部分。

    启用admin管理工具

    要启动admin管理工具,只需要在urls.py中启用对应的admin路由配置即可,

    通常我们在使用PyCharm生成项目时会在 urls.py 中自动设置好

    from django.conf.urls import url
    from django.contrib import admin
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
    
    ]

    使用admin管理工具

    使用 python manage.py createsuperuser 来创建管理员账号,来登录admin管理后台。

    吧需要管理的数据模型注册到admin

    admin.site.register(models.Publisher)
    admin.site.register(models.Book)
    admin.site.register(models.Author)

    在admin.py中只要按照上面的方式将某个模型类(model class)注册,即可在Admin中实现该model对应的数据表增删改查的功能。

    admin的定制

    如果想要进行更多的定制操作,需要利用ModelAdmin进行操作。

    # 注册方式1
    class PublisherAdmin(admin.ModelAdmin):
        list_display = ("name", "address")
    
    
    admin.site.register(models.Publisher, PublisherAdmin)
    
    
    # 注册方式2
    @admin.register(models.Book)
    class BookAdmin(admin.ModelAdmin):
        list_display = ("title", "price", "publish_date", "publisher")

     

    modelAdmin支持的定制项

    ModelAdmin中提供了大量的可定制功能,如

    1.list_display,列表时,定制显示的列。

    @admin.register(models.UserInfo)
    class UserAdmin(admin.ModelAdmin):
        list_display = ('user', 'pwd', 'xxxxx')
     #自定义列
        def xxxxx(self, obj):
            return "xxxxx"

    2、list_display_links,定制可以点击的列。

    @admin.register(models.UserInfo)
    class UserAdmin(admin.ModelAdmin):
        list_display = ('user', 'pwd', 'xxxxx')
        list_display_links = ('pwd',)

    3、list_filter 定义右侧快速筛选。

    4.list_select_related  列表时,连表查询是否自动select_related

    5、list_editable,列表页,定制可编辑列。

    @admin.register(models.UserInfo)
    class UserAdmin(admin.ModelAdmin):
        list_display = ('user', 'pwd','ug',)
        list_editable = ('ug',)

    6、search_fields, 列表时,模糊搜索的功能。

    @admin.register(models.UserInfo)
    class UserAdmin(admin.ModelAdmin):
         
        search_fields = ('user', 'pwd')

    7、date_hierarchy,列表时,对Date和DateTime进行搜索。

    @admin.register(models.UserInfo)
    class UserAdmin(admin.ModelAdmin):
     
        date_hierarchy = 'ctime'

    8、inlines ,详细页面如果有其他表与当前做FK,那么详细页面可以做动态的增加和删除。

    class UserInfoInline(admin.StackedInline): # TabularInline
        extra = 0
        model = models.UserInfo
     
     
    class GroupAdminMode(admin.ModelAdmin):
        list_display = ('id', 'title',)
        inlines = [UserInfoInline, ]

    9、action 列表时,定制action中的操作(批量操作)。

    @admin.register(models.UserInfo)
    class UserAdmin(admin.ModelAdmin):
     
        # 定制Action行为具体方法
        def func(self, request, queryset):
            print(self, request, queryset)
            print(request.POST.getlist('_selected_action'))
     
        func.short_description = "中文显示自定义Actions"
        actions = [func, ]
     
        # Action选项都是在页面上方显示
        actions_on_top = True
        # Action选项都是在页面下方显示
        actions_on_bottom = False
     
        # 是否显示选择个数
        actions_selection_counter = True

    10、定制html模版

    add_form_template = None
    change_form_template = None
    change_list_template = None
    delete_confirmation_template = None
    delete_selected_confirmation_template = None
    object_history_template = None

    11、row_id_fields  详细页面,FK和M2M变成input框的形式。

    @admin.register(models.UserInfo)
    class UserAdmin(admin.ModelAdmin):
     
        raw_id_fields = ('FK字段', 'M2M字段',)

    12、 fields 详细页面定制显示哪些字段。

    @admin.register(models.UserInfo)
    class UserAdmin(admin.ModelAdmin):
        fields = ('user',)

    13、exclude  详细页面时,排除的字段。

    @admin.register(models.UserInfo)
    class UserAdmin(admin.ModelAdmin):
        exclude = ('user',)

    14、readonly_fields 详细页面定制只读字段。

    @admin.register(models.UserInfo)
    class UserAdmin(admin.ModelAdmin):
        readonly_fields = ('user',)

    15、fieldsets 详细页面时,对数据进行分割显示。

    @admin.register(models.UserInfo)
    class UserAdmin(admin.ModelAdmin):
        fieldsets = (
            ('基本数据', {
                'fields': ('user', 'pwd', 'ctime',)
            }),
            ('其他', {
                'classes': ('collapse', 'wide', 'extrapretty'),  # 'collapse','wide', 'extrapretty'
                'fields': ('user', 'pwd'),
            }),
        )

    16、详细页面时,M2M显示时,数据移动选择(方向:上下和左右)。

    @admin.register(models.UserInfo)
    class UserAdmin(admin.ModelAdmin):
        filter_vertical = ("m2m字段",) # 或filter_horizontal = ("m2m字段",)

    17、ordering,列表时, 数据排序规则。

    @admin.register(models.UserInfo)
    class UserAdmin(admin.ModelAdmin):
        ordering = ('-id',)
        或
        def get_ordering(self, request):
            return ['-id', ]

    18、radio_fields 详细页面时 使用oradio显示选项(FK默认使用select)

    radio_fields = {"ug": admin.VERTICAL} # 或admin.HORIZONTAL

    19、form=ModelForm  用于定制用户请求时候的表单验证。

    from app01 import models
    from django.forms import ModelForm
    from django.forms import fields
     
     
    class MyForm(ModelForm):
        others = fields.CharField()
     
        class Meta:
            model = models = models.UserInfo
            fields = "__all__"
     
    @admin.register(models.UserInfo)
    class UserAdmin(admin.ModelAdmin):
     
        form = MyForm

    20、empty_value_fdisplay="数据为空时,显示默认值"

    @admin.register(models.UserInfo)
    class UserAdmin(admin.ModelAdmin):
        empty_value_display = "列数据为空时,默认显示"
     
        list_display = ('user','pwd','up')
     
        def up(self,obj):
            return obj.user
        up.empty_value_display = "指定列数据为空时,默认显示"

    示例1:

    from django.contrib import admin
    
    # Register your models here.
    
    from .models import *
    
    
    
    
    class BookInline(admin.StackedInline): # TabularInline
        extra = 0
        model = Book
    
    class BookAdmin(admin.ModelAdmin):
    
        list_display = ("title",'publishDate', 'price',"foo","publisher")
        list_display_links = ('publishDate',"price")
        list_filter = ('price',)
        list_editable=("title","publisher")
        search_fields = ('title',)
        date_hierarchy = 'publishDate'
        preserve_filters=False
    
        def foo(self,obj):
    
            return obj.title+str(obj.price)
    
    
    
        # 定制Action行为具体方法
        def func(self, request, queryset):
            print(self, request, queryset)
            print(request.POST.getlist('_selected_action'))
    
        func.short_description = "中文显示自定义Actions"
        actions = [func, ]
        # Action选项都是在页面上方显示
        actions_on_top = True
        # Action选项都是在页面下方显示
        actions_on_bottom = False
    
        # 是否显示选择个数
        actions_selection_counter = True
    
    
    
        change_list_template="my_change_list_template.html"
    
    
    
    class PublishAdmin(admin.ModelAdmin):
         list_display = ('name', 'email',)
         inlines = [BookInline, ]
    
    
    
    admin.site.register(Book, BookAdmin) # 第一个参数可以是列表
    admin.site.register(Publish,PublishAdmin)
    admin.site.register(Author)
    
    示例代码
    View Code

     示例2:

    from django.contrib import admin
    
    # Register your models here.
    
    
    from Xadmin.service.Xadmin import site,ModelXadmin
    
    print("app01 Xadmin")
    
    from app01.models import *
    from django.utils.safestring import  mark_safe
    
    class BookConfig(ModelXadmin):
        def edit(self,obj=None,is_header=False):
            if is_header:
                return "操作"
            # 反向解析:url
            return mark_safe("<a href='%s/change/'>编辑</a>"%obj.pk)
    
        def delete(self,obj=None,is_header=False):
    
            if is_header:
                return "操作"
    
            return mark_safe("<a href=''>删除</a>")
    
        def check(self,obj=None,is_header=False):
            if is_header:
                return "选择"
    
            return mark_safe("<input type='checkbox'>")
    
    
        list_display=[check,"nid","title","publish",edit,delete]
        #list_display=["nid","title","publish"]
    
    site.register(Book,BookConfig)
    
    
    
    site.register(Publish)
    site.register(Author)
    site.register(AuthorDetail)
    View Code

    数据库

    连接sqlite3

    配置

        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        }
    

    连接mysql

    在__init__.py中增加

    import pymysql
    pymysql.install_as_MySQLdb()
    

    配置

        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'dnp',
            'USER': 'root',
            'PASSWORD': 'root',  # 请换成自己的密码
            'HOST': '127.0.0.1',  # 如果不能连接,改成localhost试下
            'POST': '3306',
        },
    

    连接mysql5.7报错

    由于加密方式改变
    需要在url后增加 
    ?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
    

    数据生成

    #生成脚本
    python manage.py makemigrations
    #执行脚本
    python manage.py migrate
    

     sqlite3转存mysql

    参考:点击

    模型

    数据类型

    admin定制

    注册

    方式一

    方式二

    @admin.register(models.Book)
    class BookAdmin(admin.ModelAdmin):
        list_display = ("title", "price", "publish_date", "publisher")
    

      

    模块创建

     执行命令创建

    在setting中增加

    INSTALLED_APPS = [
        'cms.apps.CmsConfig',
    ]
    

      

  • 相关阅读:
    django入门系列 -表单视图
    django学习 -模型层初体验
    python 元组与list的区别
    解决容器内部无法访问宿主机端口的问题
    记一次pyccharm Terminal django 执行 python migrate 无法生成新的数据表的报错过程
    ES学习之ES语法入门
    docker seleniumgrid 问题解决
    selenium的Grid方式遇到 1 requests waiting for a slot to be free. 问题
    js写的ajax
    ajax jQ写的上传进度条
  • 原文地址:https://www.cnblogs.com/huay/p/11465341.html
Copyright © 2011-2022 走看看