您的位置:首页 > 编程语言 > Go语言

Django(五)后台显示自定义

2017-12-18 17:56 621 查看
在上一章节简单介绍了django后台的创建、使用及管理等,但是在真正的管理的时候我们需要显示对应数据表里的某些具体的内容,或者只可以修改其中的部分字段。这就需要我们自己设置显示字段了。还有就是除了django自带的Field,我们可以自定义Field来使用。

后台进阶

后台汉化

在项目的第二层demo目录下的settings.py文件中找到这两句并修改为如下,修改时区是为了在写入或者修改数据库中关于时间的字段能符合你本地时间(以下是基于django1.8版本以上修改方式):

LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'


后台标题和名称的修改

在上一章中你会发现后台管理的标题是:Django管理,在实际项目中不可能使用它这个标题,原来界面如下:



可以看到网页title为“登录|Django后台管理”,header为“Django管理”,当然这些是可以修改的,我们打开login这个app模型下的admin.py文件并修改为如下(还有一种方法是重写admin.AdminSite这里就不做介绍了):

from django.contrib import admin

# Register your models here.
from login.models import Members
from login.models import Types

admin.site.site_header = '智城后台管理'
admin.site.site_title = '智城'
admin.site.register(Members)
admin.site.register(Types)


修改后的界面如下:



favicon.ico配置

默认情况下,浏览器访问一个网站的时候,同时还会向服务器请求“/favicon.ico”这个URL,目的是获取网站的图标。没有图标就用默认的图标,所以这个错误也没有跟通常的404错误一样在网页上显示出来。

不过我们还是应该给网站配置一个图标,这样用户体验会更好一些。

首先我们选好一个图标并重命名为favicon.ico,然后把这个图标放在 /static/img/ 目录下。由于django后台中没有设置favicon.ico图标的语句,所以我们得修改它的base.html页面。 任何Django默认admin模块都可以被重写或者修改,重写修改后的模板要放在哪里呢?默认情况,Django自动查找目录/templates/子目录里面的每个应用包,作为后备(不要忘记django.contrib.admin也是一个应用),如果没找到对应的重写或者修改的文件就回去django的安装目录里去找默认的模板文件。所以我们要修改它的模板就先在templates文件夹下建立一个admin文件,然后通过在终端找到django安装包路径,然后去里面将base_site.html复制到刚刚建立的admin目录下:

# python2的django安装包所在位置
python -c "import sys;sys.path=sys.path[1:];import django;print(django.__path__)"
# python3的django安装包所在位置
python3 -c "import sys;sys.path=sys.path[1:];import django;print(django.__path__)"


然后进入到这个目录,再进入里面的 contrib/admin/templates/admin/ 目录就能看到这个html文件了,将这个base_site.html文件复制到新建的admin目录下,添加一行link标签:

<head>
<title>{% block title %}{% endblock %}</title>
<link rel="icon" type="image.png" href="/static/img/favicon.ico">  <!--  added here  -->
<link rel="stylesheet" type="text/css" href="{% block stylesheet %}{% static "admin/css/base.css" %}{% endblock %}" />
{% block extrastyle %}{% endblock %}
{% if LANGUAGE_BIDI %}<link rel="stylesheet" type="text/css" href="{% block stylesheet_rtl %}{% static "admin/css/rtl.css" %}{% endblock %}" />{% endif %}
{% block extrahead %}{% endblock %}
{% block blockbots %}<meta name="robots" content="NONE,NOARCHIVE" />{% endblock %}
</head>


然后运行后台就可以看到网站的图标了:



后台logo添加

由于django后台没有logo,我们想添加自己的logo也要修改它的默认模板,我们只需要修改base_site.html文件就可以了,同favicon.ico配置一样,去到django包安装的 contrib/admin/templates/admin/ 目录下复制base_site.html到admin文件夹下,并做如下修改(在django的模板中,一个block代表html中的一个div标签,比如{% block branding %}在html中解析出来就是
<div id='branding'>
,django已经写好branding的css样式,我们把logo图片设置大小后放在这里):

{% extends "admin/base.html" %}

{% block title %}{{ title }} | {{ site_title|default:_('Django site admin') }}{% endblock %}

{% block branding %}
<img src="/static/img/xiaomi_logo.png" style="line-height: 40px; width:
efcd
40px;height: 40px;float: left;">   <!-- added a line here-->
<h1 id="site-name" style="float: left;"><a href="{% url 'admin:index' %}">{{ site_header|default:_('Django administration') }}</a></h1>  <!-- added style here-->
{% endblock %}

{% block nav-global %}{% endblock %}


最后登录和进入后的效果图如下(颜色不太配,这里只做演示就不管了):





数据表显示设置

我们登录进去,点进members显示只有这个数据表中的name字段如下图:



我们想显示其它字段怎么办呢,打开login这个app模型下的admin.py文件修改为如下:

from django.contrib import admin

# Register your models here.
from login.models import Members
from login.models import Types

@admin.register(Members)
class MembersAdmin(admin.ModelAdmin):
# listdisplay设置要显示在列表中的字段(id字段是Django模型的默认主键)
list_display = ('name', 'sex', 'age', 'TEL', 'member_type')

# list_per_page设置每页显示多少条记录,默认是100条
list_per_page = 50

# ordering设置默认排序字段,负号表示降序排序
# ordering = ('-name',)

# 操作项功能显示位置设置,两个都为True则顶部和底部都显示
actions_on_top =True
actions_on_bottom = True
# 操作项功能显示选中项的数目
actions_selection_counter = True
# 字段为空值显示的内容
empty_value_display = ' -空白- '

# list_editable 设置默认可编辑字段(name默认不可编辑,因为它是一个链接,点击会进入修改页面)
list_editable = ['TEL', 'member_type',]

# fk_fields 设置显示外键字段
fk_fields = ('member_type',)

# 过滤器功能及能过滤的字段
list_filter = ('name', 'member_type')
# 搜索功能及能实现搜索的字段
search_fields = ('name', 'TEL', )

admin.site.site_header = '智城后台管理'
admin.site.site_title = '智城'
# admin.site.register(Members)
admin.site.register(Types)


刷新刚才后台的页面结果如下,你可以搜索一个名字试一下,一般ManyToManyField多对多字段用过滤器;标题等文本字段用搜索框;日期时间用分层筛选。过滤器如果是外键需要遵循这样的语法:本表字段__外键表要显示的字段。如:“user__user_name”(还有更多的选项,详细可以查看官网):



显示颜色

我们在login这个app模型的models.py文件中修改Members类如下:

# _*_ coding:utf-8 _*_

from __future__ import unicode_literals

from django.db import models
from django.utils.html import format_html

# Create your models here.

class Types(models.Model):
TYPE_CHOICES = (
(0, '超级管理员'),
(1, '管理员'),
(2, '导师'),
(3, '成员'),
(4, '游客')
)
name = models.CharField(max_length=20, verbose_name='名称')
types = models.IntegerField(default=4, help_text='选择用户类型的编号', verbose_name='用户类型', choices=TYPE_CHOICES)

def __str__(self):
return self.name

class Members(models.Model):
name = models.CharField(max_length=20)
sex = models.CharField(max_length=2)
age = models.IntegerField(null=True)

TEL = models.CharField(max_length=11)

nickname = models.CharField(max_length=20)
password = models.CharField(max_length=15)

# create_time = models.DateTimeField()

member_type = models.ForeignKey(Types)

def sex_color(self):
if self.sex == '男':
color = '#00F'
elif self.sex == '女':
color = '#F00'
else:
color = ''
return format_html(
'<span style="color: {}">{}</span>',
color,
self.sex,
)

def __str__(self):
return self.name


然后在admin.py文件中将list_display修改为如下,这里简单解释以下list_display是要显示的字段,对于sex_color这个字段在django中没有,那么django就会去调sex_color函数:

list_display = ('name', 'sex_color', 'age', 'TEL', 'member_type')


后台显示如下:



使用Font Awesome图标

首先在 /demo/templates/admin/base.html 中引入Font Awesome的css文件(以下是在线的,你也可以下载下来作为静态文件,配置参照前面章节):

<head>
<title>{% block title %}{% endblock %}</title>
<link rel="icon" type="image.png" href="/static/img/favicon.ico">  <!--  added here  -->
<link rel="stylesheet" href="https://cdn.bootcss.com/font-awesome/4.7.0/css/font-awesome.css"> <!-- add online css here-->
<link rel="stylesheet" type="text/css" href="{% block stylesheet %}{% static "admin/css/base.css" %}{% endblock %}" />
{% block extrastyle %}{% endblock %}
{% if LANGUAGE_BIDI %}<link rel="stylesheet" type="text/css" href="{% block stylesheet_rtl %}{% static "admin/css/rtl.css" %}{% endblock %}" />{% endif %}
{% block extrahead %}{% endblock %}
{% block blockbots %}<meta name="robots" content="NONE,NOARCHIVE" />{% endblock %}
</head>


然后修改login这个app模型下models.py文件的Members类:

class Members(models.Model):
name = models.CharField(max_length=20)
sex = models.CharField(max_length=2)
age = models.IntegerField(null=True)

TEL = models.CharField(max_length=11)

nickname = models.CharField(max_length=20)
password = models.CharField(max_length=15)

# create_time = models.DateTimeField()

member_type = models.ForeignKey(Types)

def sex_color(self):
if self.sex == '男':
color = '#00F'
elif self.sex == '女':
color = '#F00'
else:
color = ''
return format_html(
'<span style="color: {}">{}</span>',
color,
self.sex,
)

def sex_name(self):
if self.sex == '男':
classes = 'fa fa-mars'
color = '#00F'
elif self.sex == '女':
classes = 'fa fa-venus'
color = '#F00'
else:
classes = ''
color = ''
return format_html(
'{}<span class="{}" style="color: {}"></span>',
self.name,
classes,
color,
)

def __str__(self):
return self.name


再修改login这个app模型下admin.py文件的MembersAdmin类的list_display元组:

list_display = ('sex_name', 'sex_color', 'age', 'TEL', 'member_type')


后台显示页面为:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  django