Django 管理后台
Django自带了管理后台,而且非常强大,这个模块是settings.py 中配置的django.contrib.admin应用。
创建一个管理员用户
我们首先来创建一个后台管理员用户,并为其设置密码。
创建账号:
python manage.py createsuperuser
会要求我们输入用户名、邮箱和密码。
创建好之后,启动服务器:
python manage.py runserver
在浏览器中输入如下地址:
进入管理后台登陆界面,输入刚才设置的用户名和密码就可以登陆了。
让我们自己的应用可以在后台管理
打开polls/admin.py输入如下代码:
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.contrib import admin
from .models import Question
# Register your models here.
admin.site.register(Question)
这样在后台我们就可以编辑我们的Question了。
自定义管理表单
调整字段顺序
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.contrib import admin
from .models import Question
# Register your models here.
class QuestionAdmin(admin.ModelAdmin):
fields = ['pub_date','question_text']
admin.site.register(Question,QuestionAdmin)
这样可以先添加日期,后添加问题内容。
对字段分组
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.contrib import admin
from .models import Question
# Register your models here.
class QuestionAdmin(admin.ModelAdmin):
#fields = ['pub_date','question_text']
fieldsets = [
(None, {'fields':['question_text']},
'Date information',{'fields':['pub_date']}),
]
admin.site.register(Question,QuestionAdmin)
每个字段集指定HTML样式类
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.contrib import admin
from .models import Question
# Register your models here.
class QuestionAdmin(admin.ModelAdmin):
# fields = ['pub_date','question_text']
fieldsets = [
(None, {'fields':['question_text']},
'Date information',{'fields':['pub_date'],'classes':['collapse']}),
]
admin.site.register(Question,QuestionAdmin)
添加关联对象
好了,我们已经有自己的Question管理界面。 但是一个Question有多个Choices,管理界面中并没有将选项显示出来。
有两种方法来解决这个问题:
1.第一种是像我们为Question做的一样,在管理站点中注册Choice
# -*- coding: utf-8 -*-
from django.contrib import admin
from .models import Question
# Register your models here.
admin.site.register(Question)
admin.site.register(Choice)
2.在添加Question时添加Choice
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.contrib import admin
from .models import Question
# Register your models here.
class ChoiceInine(admin.StackedInline):
model = Choice
extra = 3
class QuestionAdmin(admin.ModelAdmin):
fieldsets = [
(None, {'fields':['question_text']},
'Date information',{'fields':['pub_date'],'classes':['collapse']}),
]
inlines = [ChoiceInine]
admin.site.register(Question,QuestionAdmin)
将Choice改为单行输入:
class ChoiceInine(admin.TabularInline):
让对象显示字段
默认地,Django显示每个对象的str()返回的内容。但有时如果我们能显示个别的字段将很有帮助。我们使用list_display 选项来实现这个功能,它是一个要显示的字段名称的元组:
class Question(models.Model):
list_display=('question_text','pub_date')
显示中文
修改模型如下:
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models
# Create your models here.
class Question(models.Model):
question_text = models.CharField(verbose_name="问题",max_length=200)
pub_date = models.DateTimeField(verbose_name="发布日期")
def __str__(self):
return self.question_text
class Meta:
verbose_name = ('问题')
verbose_name_plural=verbose_name
class Choice(models.Model):
question = models.ForeignKey(Question)
choice_text = models.CharField(verbose_name='选项',max_length=200)
vote = models.IntegerField(verbose_name='投票数',default=0)
def __str__(self):
return self.choice_text
def Meta:
verbose_name = ('选项')
verbose_name_plural=verbose_name
自定义管理后台的外观
自定义管理后台步骤如下:
1.创建一个templates文件,在myblog目录下面(包含manage.py的目录)。
2.让系统识别该模板目录,打开settings.py,找到TEMPLATES选项。
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
3.在templates下创建一个名为admin的文件夹,然后从Django安装的原目录下(目录为django/contrib/admin/templates)将模板页面的源文件admin/base_site.html拷贝到这个文件夹里。
修改如下:
{% extends "admin/base.html" %}
{% block title %}{{ title }} | {{ site_title|default:_('Django site admin') }}{% endblock %}
{% block branding %}
<h1 id="site-name"><a href="{% url 'admin:index' %}">{{ site_header|default:_('Django administration') }}</a></h1>
{% endblock %}
{% block nav-global %}{% endblock %}