django的后台我们只要加少些代码,就可以实现强大的功能。

与后台相关文件:每个app中的 admin.py 文件与后台相关。

下面示例是做一个后台添加博客文章的例子:

一,新建一个 名称为 zqxt_admin 的项目

1
django-admin.py startproject zqxt_admin

二,新建一个 叫做 blog 的app

1
2
3
4
5
# 进入 zqxt_admin 文件夹
cd zqxt_admin
 
# 创建 blog 这个 app
python manage.py startapp blog

注意:不同版本的 Django 创建 project 和 app 出来的文件会有一些不同

三,修改 blog 文件夹中的 models.py

1
2
3
4
5
6
7
8
9
10
# coding:utf-8
from django.db import models
 
 
class Article(models.Model):
    title = models.CharField(u'标题', max_length=256)
    content = models.TextField(u'内容')
 
    pub_date = models.DateTimeField(u'发表时间', auto_now_add=True, editable = True)
    update_time = models.DateTimeField(u'更新时间',auto_now=True, null=True)

四,把 blog 加入到settings.py中的INSTALLED_APPS中

1
2
3
4
5
6
7
8
9
10
INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
 
    'blog',
)

提示:INSTALLED_APPS 是一个元组,每次加入新的app的时候,在后面都加一个逗号,这是一个好习惯。

五,同步所有的数据表

1
2
3
4
5
6
# 进入包含有 manage.py 的文件夹
python manage.py makemigrations
python manage.py migrate
 
注意:Django 1.6.x 及以下的版本需要用以下命令
python manage.py syncdb

可以看到:

Creating tables ...

Creating table django_admin_log

Creating table auth_permission

Creating table auth_group_permissions

Creating table auth_group

Creating table auth_user_groups

Creating table auth_user_user_permissions

Creating table auth_user

Creating table django_content_type

Creating table django_session

Creating table blog_article

You just installed Django's auth system, which means you don't have any superusers defined.

Would you like to create one now? (yes/no): yes

Username (leave blank to use 'tu'): tu

Email address:

Password:

Password (again):

Superuser created successfully.

Installing custom SQL ...

Installing indexes ...

Installed 0 object(s) from 0 fixture(s)

如果是 Django 不主动提示创建管理员(Django 1.9不提示)用下面的命令创建一个帐号(密码输入看不到并不是不能输入)

1
python manage.py createsuperuser

六,修改 admin.py

进入 blog 文件夹,修改 admin.py 文件(如果没有新建一个),内容如下

1
2
3
4
5
from django.contrib import admin
from .models import Article
 
 
admin.site.register(Article)

只需要这三行代码,我们就可以拥有一个强大的后台!

提示:urls.py中关于 admin的已经默认开启,如果没有,参考这里

七,打开 开发服务器

1
2
python manage.py runserver
# 如果提示 8000 端口已经被占用,可以用 python manage.py runserver 8001 以此类推

访问 http://localhost:8000/admin/ 输入设定的帐号和密码, 就可以看到:

点击 Articles,动手输入 添加几篇文章,就可以看到:

我们会发现所有的文章都是叫 Article object,这样肯定不好,比如我们要修改,如何知道要修改哪个呢?

我们修改一下 blog 中的models.py

1
2
3
4
5
6
7
8
9
10
11
12
13
# coding:utf-8
from django.db import models
 
 
class Article(models.Model):
    title = models.CharField(u'标题', max_length=256)
    content = models.TextField(u'内容')
 
    pub_date = models.DateTimeField(u'发表时间', auto_now_add=True, editable = True)
    update_time = models.DateTimeField(u'更新时间',auto_now=True, null=True)
 
    def __unicode__(self):# 在Python3中用 __str__ 代替 __unicode__
        return self.title

我们加了一个 __unicode__ 函数,刷新后台网页,会看到:

所以推荐定义 Model 的时候 写一个 __unicode__ 函数(或 __str__函数)

技能提升:如何兼容python2.x和python3.x呢?

示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# coding:utf-8
from __future__ import unicode_literals
 
from django.db import models
from django.utils.encoding import python_2_unicode_compatible
 
@python_2_unicode_compatible
class Article(models.Model):
    title = models.CharField('标题', max_length=256)
    content = models.TextField('内容')
 
    pub_date = models.DateTimeField('发表时间', auto_now_add=True, editable = True)
    update_time = models.DateTimeField('更新时间',auto_now=True, null=True)
 
    def __str__(self):
        return self.title

python_2_unicode_compatible 会自动做一些处理去适应python不同的版本,本例中的 unicode_literals 可以让python2.x 也像 python3 那个处理 unicode 字符,以便有更好地兼容性。

八,在列表显示与字段相关的其它内容

后台已经基本上做出来了,可是如果我们还需要显示一些其它的fields,如何做呢?

1
2
3
4
5
6
7
from django.contrib import admin
from .models import Article
 
class ArticleAdmin(admin.ModelAdmin):
    list_display = ('title','pub_date','update_time',)
 
admin.site.register(Article,ArticleAdmin)

List_display就是显示在文章上面的提示,默认值如果没有这个就是Article默认return的那个

list_display 就是来配置要显示的字段的,当然也可以显示非字段内容,或者字段相关的内容,比如:

1
2
3
4
5
6
7
8
9
class Person(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
 
    def my_property(self):
        return self.first_name + ' ' + self.last_name
    my_property.short_description = "Full name of the person"
 
    full_name = property(my_property)

在admin.py中

1
2
3
4
5
6
7
8
9
10
11
12
13
from django.contrib import admin
from .models import Article, Person
 
 
class ArticleAdmin(admin.ModelAdmin):
    list_display = ('title''pub_date''update_time',)
 
 
class PersonAdmin(admin.ModelAdmin):
    list_display = ('full_name',)
 
admin.site.register(Article, ArticleAdmin)
admin.site.register(Person, PersonAdmin)

到这里我们发现我们又有新的需求,比如要改 models.py 中的字段,添加一个文章的状态(草稿,正式发布),这时候我们就需要更改表,django 1.7以前的都不会自动更改表,我们需要用第三方插件 South,参见 Django 迁移数据

Django 1.7 及以上用以下命令来同步数据库表的更改

1
2
python manage.py makemigrations
python manage.py migrate

本节代码下载:

zqxt_admin (Django 1.6).zip (基于Django 1.6,后台帐号 tu 密码 zqxt)

zqxt_admin (Django 1.9).zip (基于 Django 1.9 后台帐号 tu 密码 ziqiangxuetang)

其它一些常用的功能:

搜索功能:search_fields = ('title', 'content',) 这样就可以按照 标题或内容搜索了

https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.search_fields

筛选功能:list_filter = ('status',) 这样就可以根据文章的状态去筛选,比如找出是草稿的文章

https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_filter

新增或修改时的布局顺序https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.fieldsets

有时候我们需要对django admin site进行修改以满足自己的需求,那么我们可以从哪些地方入手呢?

以下举例说明:

1.定制加载的列表, 根据不同的人显示不同的内容列表,比如输入员只能看见自己输入的,审核员能看到所有的草稿,这时候就需要重写get_queryset方法

1
2
3
4
5
6
7
class MyModelAdmin(admin.ModelAdmin):
    def get_queryset(self, request):
        qs = super(MyModelAdmin, self).get_queryset(request)
        if request.user.is_superuser:
            return qs
        else:
            return qs.filter(author=request.user)

该类实现的功能是如果是超级管理员就列出所有的,如果不是,就仅列出访问者自己相关的

2.定制搜索功能(django 1.6及以上才有)

1
2
3
4
5
6
7
8
9
10
11
12
class PersonAdmin(admin.ModelAdmin):
    list_display = ('name''age')
    search_fields = ('name',)
 
    def get_search_results(self, request, queryset, search_term):
        queryset, use_distinct = super(PersonAdmin, self).get_search_results(request, queryset, search_term)
        try:
            search_term_as_int = int(search_term)
            queryset |= self.model.objects.filter(age=search_term_as_int)
        except:
            pass
        return queryset, use_distinct

queryset 是默认的结果,search_term 是在后台搜索的关键词

3.修改保存时的一些操作,可以检查用户,保存的内容等,比如保存时加上添加人

1
2
3
4
5
6
from django.contrib import admin
 
class ArticleAdmin(admin.ModelAdmin):
    def save_model(self, request, obj, form, change):
        obj.user = request.user
        obj.save()

其中obj是修改后的对象,form是返回的表单(修改后的),当新建一个对象时 change = False, 当修改一个对象时 change = True
如果需要获取修改前的对象的内容可以用

1
2
3
4
5
6
7
from django.contrib import admin
 
class ArticleAdmin(admin.ModelAdmin):
    def save_model(self, request, obj, form, change):
        obj_original = self.model.objects.get(pk=obj.pk)
        obj.user = request.user
        obj.save()

那么又有问题了,这里如果原来的obj不存在,也就是如果我们是新建的一个怎么办呢,这时候可以用try,except的方法尝试获取,当然更好的方法是判断一下这个对象是新建还是修改,是新建就没有 obj_original,是修改就有

1
2
3
4
5
6
7
8
9
10
11
from django.contrib import admin
 
class ArticleAdmin(admin.ModelAdmin):
    def save_model(self, request, obj, form, change):
        if change:# 更改的时候
            obj_original = self.model.objects.get(pk=obj.pk)
        else:# 新增的时候
            obj_original = None
 
        obj.user = request.user
        obj.save()

4, 删除时做一些处理,

1
2
3
4
5
6
7
8
9
from django.contrib import admin
 
class ArticleAdmin(admin.ModelAdmin):
    def delete_model(self, request, obj):
        """
        Given a model instance delete it from the database.
        """
        # handle something here
        obj.delete()

Django的后台非常强大,这个只是帮助大家入门,更完整的还需要查看官方文档,如果你有更好的方法或不懂的问题,欢迎评论!

Django后台的更多相关文章

  1. python运维开发(十九)----Django后台表单验证、session、cookie、model操作

    内容目录: Django后台表单验证 CSRF加密传输 session.cookie model数据库操作 Django后台Form表单验证 Django中Form一般有2种功能: 1.用于做用户提交 ...

  2. Django后台设置--遇到的问题与解决方案

    1. 后台如何管理项目中的models 新建的Django工程会自动引用admin 应用,新建后台可以通过 createsuperuser 命令建立后台admin超级管理员,我遇到的第一个问题,就是如 ...

  3. Django 后台支持中文方法

    今天遇到的一个问题,mark一下: django后台可以支持中文界面,一开始一直纠结于settings.py 中 LANGUAGE_CODE = 'en-us'中的'en-us'该更改成什么.zh-c ...

  4. 强大的Django后台管理

    Django 后台 django的后台我们只要加少些代码,就可以实现强大的功能.与后台相关文件:每个app中的 admin.py 文件与后台相关 下面示例是做一个后台添加博客文章的例子: 新建一个 名 ...

  5. django后台导入excel文件

    1.django 如何从后台上传excel中批量解析数据 要从django后台导入的excel中批量解析数据,举一个例子,我们向后抬批量导入svn历史数据数据格式 假设excel表中有4列,每列分别是 ...

  6. django后台获取相同name名的数据

    django后台获取相同name名的post数据html: <form method="post"> <input type="text" n ...

  7. 1.1 、Django 后台

    Django 后台 与后台相关文件:每个app中的 admin.py 文件与后台相关. 一,新建一个 名称为 HelloDjango 的项目 django-admin.py startproject ...

  8. jquery ajax 提交form表单 以及django后台接受

    HTML <form id="project_file_upload" enctype="multipart/form-data" > <di ...

  9. 前台通过form表单向Django后台传输数据,Django处理后返回给前台

    摘要:Django前后台数据传递 通过action将数据传输给apitest这个地址,使用get方法传递,此处需要传递name="request_method"的下拉列表值和nam ...

  10. django后台管理系统(admin)的简单使用

    目录 django后台管理系统的使用 检查配置文件 检查根urls.py文件 启动项目,浏览器输入ip端口/admin 如: 127.0.0.1/8000/admin 回车 注册后台管理系统超级管理 ...

随机推荐

  1. mac显示任何来源

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px "Microsoft YaHei"; color: #333333; ba ...

  2. Object-c 内存管理

                    内存管理 主要内容 1.内存管理的概念 2.引用计数 3.如何持有对象所有权 4.自动释放池 5.@property的使用 什么是内存管理 内存管理是关于如何管理对象生 ...

  3. Spring + Jedis集成Redis(集群redis数据库)

    前段时间说过单例redis数据库的方法,但是生成环境一般不会使用,基本上都是集群redis数据库,所以这里说说集群redis的代码. 1.pom.xml引入jar <!--Redis--> ...

  4. mysql深入浅出的笔记(存储过程一)

    1.存储过程和函数....    存储过程和函数是事先经过编译并存储在数据库中的一段SQL语句的集合,调用存储过程和函数可以简化应用开发人员的很多工作,    减少数据在数据库中和应用服务器之间的传说 ...

  5. php定界符<<<EOF讲解(转)

    Heredoc技术.可用来输出大段的html和javascript脚本 1.PHP定界符的作用就是按照原样,包括换行格式什么的,输出在其内部的东西: 2.在PHP定界符中的任何特殊字符都不需要转义:  ...

  6. 数学系列:XXX

    Copyright © 1900-2016, NORYES, All Rights Reserved. http://www.cnblogs.com/noryes/ 欢迎转载,请保留此版权声明. -- ...

  7. SQL Server客户端请求

    SQL Server是客户端 - 服务器平台.通过发送包含对数据库请求的命令是与后端数据库进行交互的唯一方法.你的应用程序和数据库之间通信的协议被称为TDS(表格数据流协议). 应用程序可以使用该协议 ...

  8. DDD建模案例----“视频课程”场景

    接触领域驱动设计DDD有一年多的时间了,中间看过不少书,参与过一些讨论(ENode QQ群).目前对DDD的认知还停留在理论阶段,所以对领域建模非常感兴趣,这里说的建模是指以DDD的思想为指导再加上D ...

  9. 解决select2在bootstrap的modal中默认不显示的问题

    在Bootstrap中的Modal,select2插件会有不显示,因为其z-index小于modal,还有另外一个问题是,修正z-index之后,select2不会自动失去焦点的问题.代码解决如下: ...

  10. myeclipse一直卡在loading workbench解决方法

    删除工作空间下.metadata中的org.eclipse.ui.workbench org.eclipse.ui.workbench.texteditor