3 第一个Django应用 第2部分(管理站点)
Django会根据你写的模型文件完全自动地生成管理界面。
管理界面不是让访问网站的人使用的,它服务于网站管理者。 它用于网站的管理员。
3.1创建一个管理员用户
3.2进入管理站点
3.3管理站点的功能
3.4自定义管理表单
3.5添加关联对象
3.6自定义管理界面
3.1创建一个管理员用户
首先,运行命令
python manage.py createsuperuser
根据提示输入用户名和邮件和密码
创建管理员用户成功
3.2进入管理站点
Django的管理站点是默认启用的,启动开发服务器
python manage.py runserver
现在,打开一个浏览器访问你本地域名中的 “/admin/” —— 例如http://127.0.0.1:8000/admin/。你应该会看到管理站点的登录界面
用创建的超级用户账号来登录这个站点。 会看到Django管理站点的首页面
3.3管理站点的功能
在创建的polls应用中,管理站点注册一个Question对象
#polls/admin.py from django.contrib import admin from .models import Question admin.site.register(Question)
注册了Question对象,Django会把它显示在管理站点的首页面上,
表单是根据Question模型文件自动生成的。
可以在管理站点对其进行查看,编辑和添加,删除
3.4自定义管理表单
#polls/admin.py from django.contrib import admin from .models import Question class QuestionAdmin(admin.ModelAdmin): fields = ['pub_date', 'question_text'] #更改管理选项 admin.site.register(Question, QuestionAdmin) #管理站的中注册模型
建一个模型管理对象,将其作为第二个参数传递给admin.site.register()
fields = ['pub_date', 'question_text']这一更改,使得“Publication date”字段排在“Question”字段前面
#polls/admin.py from django.contrib import admin from .models import Question class QuestionAdmin(admin.ModelAdmin): fieldsets = [ (None, {'fields': ['question_text']}), ('Date information', {'fields': ['pub_date']}), ] admin.site.register(Question, QuestionAdmin)
fieldsets中每个元组的第一个元素是字段集的标题,在管理站的中可以看到增加了标题’Date infomation’
#polls/admin.py from django.contrib import admin from .models import Question class QuestionAdmin(admin.ModelAdmin): fieldsets = [ (None, {'fields': ['question_text']}), ('Date information', {'fields': ['pub_date'], 'classes': ['collapse']}), ] admin.site.register(Question, QuestionAdmin)
可以任意地为每个字段集指定HTML样式类,
'classes': ['collapse']使得显示呈折叠状
3.5添加关联对象
我们已经有了Question管理界面,但是Question有多个Choice,管理界面并没有将选项显示出来
有两种方法来解决这个问题。
第一种是像我们为Question做的一样,在管理站点中注册Choice。
#polls/admin.py from django.contrib import admin from .models import Choice, Question # ... admin.site.register(Choice)
可以在Django管理站点中管理“Choices”
点击所以'Add choice',由于Choice与Question用ForeignKey关联,在管理界面中显示为一个<select>选框,如果在这个窗口中添加了一个Question并点击“Save”,Django会将保存这个Question到数据库中,然后动态地将这个对象添加为你正在查看的“Add choice”表单的选择项。
第二种方法,在创建Question对象的同时可以直接添加一组Choice将会更好。
移除对Choice模型的register()调用。然后将Question的注册代码编辑为:
#polls/admin.py from django.contrib import admin from .models import Choice, Question class ChoiceInline(admin.StackedInline): model = Choice extra = 3 class QuestionAdmin(admin.ModelAdmin): fieldsets = [ (None, {'fields': ['question_text']}), ('Date information', {'fields': ['pub_date'], 'classes': ['collapse']}), ] inlines = [ChoiceInline] admin.site.register(Question, QuestionAdmin)
这告诉Django:Choice对象在Question的管理界面中编辑。同时默认提供足够3个Choice的空间。
打开管理站点,可以看到关联的对象。
还有个小问题。 显示所有关联的Choice 对象的字段占用大量的屏幕空间。 为了解决这个问题,Django提供了一种以表格的形式显示内嵌的相关联对象的方法,
改变一下ChoiceInline 的声明:
#polls/admin.py class ChoiceInline(admin.TabularInline): #...
使用 TabularInline(不是StackedInline),这些相关联的对象显示成紧凑的、基于表格的形式
3.6自定义管理界面
默认的 ,Django显示每个对象str()返回的内容,如果想要显示其他字段,使用list_display 选项来实现这个功能,同时引入自定义的
方法was_published_recently
#polls/admin.py class QuestionAdmin(admin.ModelAdmin): # ... list_display = ('question_text', 'pub_date', 'was_published_recently')
在管理页中,我们可以看到,Question的变更页面自动添加了question,date,was_published_recently的内容。
如果想要给was_published_recently添加属性
#polls/models.py class Question(models.Model): # ... def was_published_recently(self): return self.pub_date >= timezone.now() - datetime.timedelta(days=1) was_published_recently.admin_order_field = 'pub_date' was_published_recently.boolean = True was_published_recently.short_description = 'Published recently?'
于是was_published_recently具有了布尔值属性,同时显示图标,short_description将标题显示为Published recently?
最后改进Question变更列表页面:使用list_filter来添加过滤器,
search_fields添加一些搜索功能:
#polls/admin.py from django.contrib import admin from .models import Question,Choice # Register your models here. class ChoiceInline(admin.TabularInline): #基于表格的显示 model = Choice extra = 3 #默认空白 class QuestionAdmin(admin.ModelAdmin): fieldsets = [(None, {'fields':['question_text']}), ('Date infomation', {'fields':['pub_date'],'classes': ['collapse']})] inlines = [ChoiceInline] list_display = ['question_text','pub_date','was_published_recently'] #显示的字段名称的元组,和其他字段 list_filter = ['pub_date'] #过滤功能,根据date属性 search_fields = ['question_text'] #搜索功能 class ChoiceAdmin(admin.ModelAdmin): fields = ['question','choice_text','votes'] admin.site.register(Question,QuestionAdmin)