first django app part 2

April 7, 2011

file:///home/bigzhu/django/docs/_build/html/index.html

file:///home/bigzhu/django/docs/_build/html/intro/tutorial02.html 开始学 django 自带的 admin site

注册 admin site

url

gvim urls.py

本来也有了,只是注释了

修改后內容为:

from django.conf.urls.defaults import *

* Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
    * Example:
    * (r'^mysite/', include('mysite.foo.urls')),

    * Uncomment the admin/doc line below and add 'django.contrib.admindocs'
    * to INSTALLED_APPS to enable admin documentation:
    * (r'^admin/doc/', include('django.contrib.admindocs.urls')),

    * Uncomment the next line to enable the admin:
    (r'^admin/', include(admin.site.urls)),
)

app

gvim settings.py

找到 INSTALLED_APPS

同样去了注释就可以:

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'polls',
    * Uncomment the next line to enable the admin:
    'django.contrib.admin',
    * Uncomment the next line to enable admin documentation:
    'django.contrib.admindocs',
)

如果没启 server,那么启起来:

python manage.py runserver 8001

访问 http://127.0.0.1:8001/admin/

要用户名和密码?

[first django app part 1](first django app part 1.md) 时,初始化数据库时不是建了一个用户么,就用那个.

进去了,但是看不到我们之前的 app polls.

向 admin 注册 app

到 app polls 的目录下:

cd polls

建立一个文件:

gvim admin.py

內容为:

from polls.models import Poll
from django.contrib import admin

admin.site.register(Poll)

这个动作,要重启 server 才能生效.

然后用 admin 界面,向 poll 中加了一条数据,结果报错:

DatabaseError at /admin/polls/poll/add/
错误:  关系 "django_admin_log" 不存在
LINE 1: INSERT INTO "django_admin_log" ("action_time", "user_id", "c...

哦,在初始化数据库的时候,还没有启用 admin.

同步数据库一下就 ok 执行:

python manage.py syncdb

再加一次,果然进去了,到 pgadmin3 中

select * from polls_poll

也有记录了

制定 admin form 的字段

制定 admin form 的字段,要修改注册 polls 的文件 admin.py

gvim admin.py

定义一个 class,并且在注册的时候,把 class 传进去

改后的內容

#!/usr/bin/env python
#encoding=utf-8
from polls.models import Poll
from django.contrib import admin

#admin.site.register(Poll)
class PollAdmin(admin.ModelAdmin):
    fields = ['pub_date', 'question']

admin.site.register(Poll, PollAdmin)

不用重启服务,刷新一下 Add poll 页面.

这个 class 的作用,就是通过这个 list 决定,在增加/修改页面,要显示哪些字段.

还可以定义字段分组:

class PollAdmin(admin.ModelAdmin):
    fieldsets = [
        (None,               {'fields': ![pic]('question')}),
        ('Date information', {'fields': ![pic]('pub_date')}),
    ]

对字段隐藏:

class PollAdmin(admin.ModelAdmin):
    fieldsets = [
        (None,               {'fields': ![pic]('question')}),
        ('Date information', {'fields': ![pic]('pub_date'), 'classes': ![pic]('collapse')}),
    ]

多表关联组成 form

还有一张表: choice 有一个字段是外键 poll,admin.py 加入:

from polls.models import Choice
class ChoiceInline(admin.StackedInline):
    model = Choice
    extra = 3

class PollAdmin(admin.ModelAdmin):
    fieldsets = [
        (None,               {'fields': ![pic]('question')}),
        ('Date information', {'fields': ![pic]('pub_date'), 'classes': ![pic]('collapse')}),
    ]
    inlines = ![pic](ChoiceInline)

admin.site.register(Poll, PollAdmin)

通过外键来组成一个 form,并且指定

extra = 3

要求生成三个 choice 的待填 form item

可以 form item 的样试,上面这个是 Stacked 风格的,可以改成表格试的,把 ChoiceInline 由继承 admin.StackedInline 改为继承 admin.TabularInline

制定己有数据的显示

由于没有指定 poll 记录要显示什么字段,页面是这样的:

images/obj.png

这样鬼知道要改哪条!

在 PollAdmin 加入:

class PollAdmin(admin.ModelAdmin):
    list_display = ('question', 'pub_date')
......

于是变成了这样:

images/item.png

好多了吧,还可以加入一些不在库表內的內容,用于说明什么的.

加入不在库表內的內容

gvim models.py
#!/usr/bin/env python
#encoding=utf-8
from django.db import models
import datetime

* Create your models here.
class Poll(models.Model):
    question = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')
    def was_published_today(self):
        return self.pub_date.date() == datetime.date.today()
    was_published_today.short_description = '今天录入的?'
......

我加入了一个方法 was_published_today

注意,字段说明我用了中文,得加入 utf-8 声明.还得重启下服务.

images/today.png

看来,有了 orm,decode 都可以退休了.

现成的过滤

gvim admin.py

加入一个 list_filter,变成这样:

class PollAdmin(admin.ModelAdmin):
    list_display = ('question', 'pub_date', 'was_published_today')
    list_filter = ![pic]('pub_date')
    fieldsets = [
        (None,               {'fields': ![pic]('question')}),
        ('Date information', {'fields': ![pic]('pub_date'), 'classes': ![pic]('collapse')}),
    ]
    inlines = ![pic](ChoiceInline)

于是页面右边多了一个 filter:

images/filter.png

点右边的过滤条件,就可以实现过滤.

was_published_today 不能加到 list_filter 里, question 可以,假的不行?

查找

search_fields = pic

class PollAdmin(admin.ModelAdmin):
    list_display = ('question', 'pub_date', 'was_published_today')
    list_filter = ['pub_date', 'question']
    search_fields = ['question', 'pub_date']
    fieldsets = [
        (None,               {'fields': ![pic]('question')}),
        ('Date information', {'fields': ![pic]('pub_date'), 'classes': ![pic]('collapse')}),
    ]
    inlines = ![pic](ChoiceInline)

images/search.png

出现了一个查找框,由于 search_fields 输入了 ‘question’, ‘pub_date’ 两个值,输入 question 和日期数值,都可以实现查找,太强了.

日期分层

class PollAdmin(admin.ModelAdmin):
    list_display = ('question', 'pub_date', 'was_published_today')
    list_filter = ['pub_date', 'question']
    search_fields = ['question', 'pub_date']
    date_hierarchy = 'pub_date'
    fieldsets = [
        (None,               {'fields': ![pic]('question')}),
        ('Date information', {'fields': ![pic]('pub_date'), 'classes': ![pic]('collapse')}),
    ]
    inlines = ![pic](ChoiceInline)

加入了 date_hierarchy = ‘pub_date’

images/hierarchy.png

可以点选不同层的时间.

制定 admin 的页面

这是在鼓励我们直接基于 django 的 admin 开发系统么?

gvim settings.py

找到 TEMPLATE_DIRS 改为

TEMPLATE_DIRS = (
    * Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
    * Always use forward slashes, even on Windows.
    * Don't forget to use absolute paths, not relative paths.
    '/home/bigzhu/Dropbox/mysite/mytemplates',
)

到 mysite 下,建立这个目录 mytemplates.

从 django 的安装目录下的 /django/contrib/admin/templates/admin 里拷过来.

先拷个 base_site.html 进去

mkdir /home/bigzhu/Dropbox/mysite/mytemplates/admin
cp /usr/local/lib/python2.6/dist-packages/django/contrib/admin/templates/admin/base_site.html /home/bigzhu/Dropbox/mysite/mytemplates/admin/

开始改吧!

gvim base_site.html

改成

{% extends "admin/base.html" %} {% load i18n %} {% block title %}{{ title }} |
{% trans 'Django site admin' %}{% endblock %} {% block branding %}
<h1 id="site-name">{% trans 'bigzhu 的管理台' %}</h1>
{% endblock %} {% block nav-global %}{% endblock %}

刷新页面,果然变了.

index 页面一样的,改着玩吧.

cp /usr/local/lib/python2.6/dist-packages/django/contrib/admin/templates/admin/index.html /home/bigzhu/Dropbox/mysite/mytemplates/admin/

comments powered by Disqus