Django自定义Admin

Django的后台管理

Django有自己的后台管理系统,我们只需要做一些简单的工作就能够把我们的模型注册到后台管理系统中。

定义模型类

#models.py

from django.db import models
class Author(models.Model):
    name = models.CharField(max_length=50)
    email = models.EmailField()
    birth_date = models.DateField(blank=True, null=True)
  1. 创建了一个继承自Model的Author类
  2. Author中加入一些自定义字段
  3. 执行数据库同步操作: manger.py makemigrations + manger.py migrate

Model Meta 选项

#models.py

from django.db import models
class Author(models.Model):
    name = models.CharField(max_length=50)
    email = models.EmailField()
    birth_date = models.DateField(blank=True, null=True)
    class Meta:
    	verbose_name = "作者"
    	verbose_name_plural  = verbose_name 

更多信息

注册Model类

# admin.py
from django.contrib import admin
from .models import Author
@admin.register(Author)
class PersonAdmin(admin.ModelAdmin):
    pass

使用用装饰器@admin.register(Author)注册Author,当然还有其它注册的方法,个人比较喜欢用这个方法。
了解更多

效果展示

为了登录后台管理系统,还需要创建一个超级用户,创建方法就不在这里赘述了。
在这里插入图片描述
在这里插入图片描述
上图中是直显示 Author object,不怎么友好…

__str__ 与list_display

#models.py
class Author(models.Model):
    name = models.CharField(max_length=50)
    email = models.EmailField()
    birth_date = models.DateField(blank=True, null=True)
    
    def __str__(self):
        return self.name

在Model类中加入__str__这后如下图示:
在这里插入图片描述
子之前好后多了…
似乎不够完美!继续修改。
之前定义的AuthorAdmin是一个空类,其实它还可以加很多属性和方法。

#admin.py
@admin.register(Author)
class AuthorAdmin(admin.ModelAdmin):
    list_display = ['name', 'email', 'birth_day']
    

加上之后效果如图示:
在这里插入图片描述
看着好多了,但是还有一些地方看关不爽。
在这里插入图片描述

# models.py
class Author(models.Model):
    name = models.CharField(max_length=50, verbose_name='姓名')
    email = models.EmailField(verbose_name='邮箱')
    birth_date = models.DateField(blank=True, null=True, verbose_name='生日')

    def __str__(self):
        return self.name
    
    class Meta:
        verbose_name = '作者'
        verbose_name_plural = verbose_name

在这里插入图片描述
更多的属性…

自定义change页

django默认的表单
在这里插入图片描述
在admin页面中加入CSS js 的方法
光引用CSS或JS其实没什么作用,CSS类必须用在控件上,之后JS还能找到控件并绑定相应的事件。
django文档已经给出的类似的例子

from django.forms import ModelForm, Textarea
from myapp.models import Author

class AuthorForm(ModelForm):
    class Meta:
        model = Author
        fields = ('name', 'title', 'birth_date')
        widgets = {
            'name': Textarea(attrs={'cols': 80, 'rows': 20}),
        }

重新定义Model字段的widget,并在widget的构造函数传入attrs属性

 widgets = {
            'name': Textarea(attrs={'cols': 80, 'rows': 20}),
        }

attris中您可以加任何属性,当然也包括 id 和 class属性

 widgets = {
            'name': Textarea(attrs={
            'cols': 80, 
            'rows': 20,
            'class': 'myclass',
            'id': 'id_author'
            }),
        }

如此再加上前面的引CSS JS的方法,在引入的CSS中定义 .myclsss{xxx},
在js中通过ID可以很快定义到当前元素,并执行一些代码。

还差最后一步,ModelForm与 Admin的结合

@admin.register(Entry)
class EntryAdmin(admin.ModelAdmin)):
    fields = ['pub_date']
    form = EntryForm

    class Media:
        pass
发布了18 篇原创文章 · 获赞 0 · 访问量 530

猜你喜欢

转载自blog.csdn.net/luan_225/article/details/98315262