Bootstrap

python web开发——Django后台管理

Django 管理后台

Django自带了管理后台,而且非常强大,这个模块是settings.py 中配置的django.contrib.admin应用。

创建一个管理员用户

我们首先来创建一个后台管理员用户,并为其设置密码。

创建账号:

python manage.py createsuperuser

会要求我们输入用户名、邮箱和密码。
创建好之后,启动服务器:

python manage.py runserver

在浏览器中输入如下地址:

http://127.0.0.1:8000/admin/

进入管理后台登陆界面,输入刚才设置的用户名和密码就可以登陆了。

让我们自己的应用可以在后台管理

打开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 %}
;