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)
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