Django1.5:(二)创建第一个Django应用2

       接着第一节中创建的Poll应用,本节展示如何自动生成admin页面。大部分CRUD工作可以通过admin来完成,而不必直接对数据库API操作。

2.1 激活admin应用

       Django中自带admin应用是可选项,激活需要完成下面三步:1)取消INSTANLLED_APPS中"django.contrib.admin"的注释;2)运行python manager.py syncdb创建数据库表(还记得吗,每个应用至少需要创建一个表);3)编辑mysite/urls.py文件,取消关于启用admin的三行注释代码,使其成为这样:

from django.conf.urls import patterns, include, url
# Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
    # Examples:
    # url(r'^$', 'mysite.views.home', name='home'),
    # url(r'^mysite/', include('mysite.foo.urls')),
    # Uncomment the admin/doc line below to enable admin documentation:
    # url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
    url(r'^admin/', include(admin.site.urls)),
)

2.2 运行开发服务器

       正如《创建第一个Django应用1》中所示的,用python manage.py runserver来启动开发服务器。在窗口显示的IP地址和端口后添加"/admin",例如http://127.0.0.1:8000/admin/
在浏览器中我们可以看到这样的登录界面:

2.3 进入admin site

       输入在创建superuser时的用户名和密码,如果你当时没有创建,可以用manage.py createsuperuser --username=leon--email=leon@example.coml 来创建。进入后你应当可以看到Django管理员页面:

2.4 显示Poll应用

      奇怪的是没有显示Poll应用?!我们需要告诉admin,Poll对象也需要有个管理界面。这就需要在polls目录下创建一个admin.py文件,敲入如下代码:

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

admin.site.register(Poll)

      重启开发服务器,就可以看到一个Poll。通常开发服务器会在你修改一个文件后重载,但是创建一个新文件不会造成admin重载。

2.5 admin管理的功能

       我们向admin注册了Poll对象,Django知道要在admin首页显示Poll。点击Poll,进入polls的"change list"页面,其展示数据库中所有的polls,我们可以选择其中一个更改,目前其中只有一个poll,也就是《创建第一个Django应用1》中输入的"What's up?"。

点击"What's up?"可以编辑question和date published,这些都是在model中定义过得字段。需要注意的是:1)这个表格是从Poll Model中自动生成的;2)不同字段类型(DateTimeFeild和CharField)会引发合适的HTML输入功能,其在Django admin中是自动的;3)DateTimeFeild获取JavaScript快捷方式来从日历或者常用时间中提供选项。其他选项包括保存、添加新poll都一目了然。如果Date published中的时间和《创建第一个Django应用1》中不同,是因为TIME_ZONE没有设置,可以进行修改,修改后能在Change History中看到。我想说的是,Django中对于时区问题,受国际化和本地化问题的困扰,还是需要仔细辨别的,官方文档中有相应说明。

2.6 定制admin表格

       只需要注册Poll对象到admin就可以自动获得界面化管理,的确非常高效。但是Django自带的admin可能需要修改界面显示和工作方式,毕竟每个人可以有自己的爱好。Django提供了定制的可能,不过需要在admin.py中写额外的一些代码。我们在把应用注册到admin时,告诉admin一些额外的需要,并一起登记到admin中,像这样:

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

改变一下pub_date和question展示的次序。


如果有许多字段需要展示,按照一种合理的次序排列是有必要的。另一方面,如果有许多字段,将他们分组也是需要的工作,同样,在Django中实现这一点也非常容易,稍微修改一下PollAdmin,如下:

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

我们可以在fieldset中使用任意的HTML类,Django也提供了一个"collapse"类用来使某个fieldset默认处于折叠状态,这个该fieldset数据很多并且补偿改变时比较有用。像这样使用代码:(’Date information’, {’fields’: [’pub_date’], ’classes’: [’collapse’]}),

2.7 添加关系对象

        还有件奇怪的事,Poll有Choices,但是它们在哪?!有两种方式能够解决这个问题:

第一种:像注册Poll那样向admin注册Choice,也就是在admin.py中添加两行代码:

from polls.models import Choice

admin.site.register(Choice)

        这样会在Poll应用下面出现Poll和Choice两个对象,点击Choice后进入Add界面,通过以下这种方式来添加每个Poll的选项:


通过Poll字段中选择问题来添加Choice,并且点击“+”可以在弹出界面中添加Poll。Django将ForeignKey处理成<select>选框,在这里我们暂时还只有一个Poll。

第二种:当然像这样添加choices效率比较低,每个Poll必然不止一个选项,我们可以在默认情况下多提供几个choice的表格。我们不是通过register()方法来引入Choice对象,而是通过下面这种方法:

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

class ChioceInline(admin.StackedInline):
    model = Choice
	extra = 3

class PollAdmin(admin.ModelAdmin):
    fieldsets = [
	    (None,              {'fields': ['question']}),
	    ('Date information',{'fields': ['pub_date']}),'classes': ['collapse']}),
	]
	inline = [ChoiceInline]
	
admin.site.register(Poll, PollAdmin)

       重启开发服务器,再次进入http://127.0.0.1:8000/admin/(注意有admin的!),可以看到Choice对象在Poll对象的管理界面处编辑,默认提供了三个choices字段。对于关系对象Choice空出了三个位置(slots),在代码中用extra指定。当然也可以增加更多的choice。


只是这样的显示方式有些占空间,我们可以选用TabularInline的方式代替StackedInline,如果用这样的方法,每个choice会多出来delete选框

2.8 定制admin变更列表

       那admin change list能不能定制呢?也就是上面图中有的显示所有polls的那个页面。默认情况下Django展示每个对象的__str__(还记得前一节中我们在model中使用过吧!),但是有时候我们也需要把field显示出来。这时候,我们么要用到list_display选项,它是用于在change list页面展示field名称的元组,我们需要在PollAdmin类中添加一行代码:

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

你可以点击每个列表表头来按照这些值排序,尤其是按照was_published_recently,值得注意的该方法作为header显示时,下划线自动被空格替代,Very nice!但或许我们可以让她做得更好。我们在polls/models.py中添加一些新的属性来加以控制:

class Poll(models.Model):
    def was_published_recently(self):
        return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
    was_published_recently.admin_order_field = 'pub_date'
    was_published_recently.boolean = True
    was_published_recently.short_description = 'Published recently?'

另外编辑polls/admin.py,在change list中使用Filter功能,在PollAdmin中添加list_filter = ['pub_date'],仅仅经过这几步,change list就改进了许多,amzing!!


Django会根据filed的类型来自动添加Filter的展示,pub_date是DateTimeFeild,所以Django选择了Any date等5个常用筛选关键词。

       再添加一个搜索功能,search_field = ['question'],这会在change list顶部生成一个搜索框,Django会根据question搜索,当然也可以设置更多的fields搜索范围。不过这是使用LIKE查询,所以要合理使用,不要使数据库负担过重。还可以date_hierarchy = 'pub_date'给change list分时间层次显示。

       这些组合可以提供比较方便的页面导航,默认情况下chang list 显示100项。

2.9 定制admin

      在admin每一页的顶部都显示了'Django administration',这显然不是我们想要的。当然这可以通过Django的模板系统来修改,Django admin是其内置的应用,也就说使用Django内部的模板。

定制项目的模板

      在项目的目录新建一个templates文件夹,虽然这个文件夹可以放在任意地方,但建议放在项目里面。在mysite/settings.py中修改

TEMPLATE_DIRS = (
    #使用绝对路径,下面换成自己的路径
    'D:/Python/Scripts/mysite/templates',
	)
找到Django默认的admin模板,其在django/contrib/admin/templates/admin/base_site.html,在创建的新templates文件夹中建一个子文件夹admin,将base_site.html放进去,就可以修改其中的代码。其中{% block branding %}和{{title}}是Django的模板语言,我们在下一节中介绍。此处修改成<h1 id="site-name">{% trans 'Leonfocus admin' %}</h1> ,或者其他喜欢的名字来替代'Django administration'。Django中所有admin的模板都可以在这样修改。
定制应用模板

      有人会问:TEMPLATE_DIRS默认是空的,Django是如何找到内部的admin模板呢?答案是Django会寻找每个app的templates子目录作为最后的选择,别忘记了django.contrib.admin也是一个应用啊!

      这里的Poll应用不是很复杂,如果出于功能需求要修改标准的admin模板 ,可以在app的templates中修改,而不是project中,这样就可以把app用于任何项目中。

2.10 定制admin首页

      既然这样,我们想为什么不连admin首页一块修改呢!默认情形下,它按照字母表顺序展示INSTALLED_APPS中所有应用,这当然也是可以修改的,其模板为admin/index.html。我们可能急需了解Django的模板语言,因为有太多我们想改一改,玩一玩的!

      让一切等到下一节吧!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值