首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

Django课程:第一个Django应用程序(2部分)

2013-09-28 
Django教程:第一个Django应用程序(2部分)Django教程:第一个Django应用程序(2部分) 2013-09-24 磁针石 #承

Django教程:第一个Django应用程序(2部分)

Django教程:第一个Django应用程序(2部分)

 

2013-09-24 磁针石

 

#承接软件自动化实施与培训等gtalk:ouyangchongwu#gmail.com qq 37391319

#博客:http://blog.csdn.net/oychw

#版权所有,转载刊登请来函联系

# 深圳测试自动化python项目接单群113938272深圳广州软件测试开发 6089740

#深圳湖南人业务户外群66250781武冈洞口城步新宁乡情群49494279

#参考资料:https://docs.djangoproject.com/en/1.5/intro/tutorial01/

# http://django-chinese-docs.readthedocs.org/en/latest/intro/tutorial01.html


 

本文的图片没有上传,完整的文档参见:python模块笔记:http://t.cn/z8ggk71  

本节关注Django 自动生成的管理站点。

    为你的员工或客户生成添加、修改和删除内容的管理性网站是个单调乏味的工作。因此Django 为模型自动化创建管理界面。

 

Django 是在新闻编辑室环境下编写的,“内容提供商”和“公共”网站之间有非常明显的界限。网站管理员使用这个系统来添加新闻、事件、体育成绩等等, 而这些内容会在公共网站上显示出来。Django 为网站管理员创建统一 的管理界面用以编辑内容。

 

管理界面不是让网站访问者使用的。它是为网站管理员准备的。

 

启用管理网站

默认情况下 Django 管理网站是关闭的。开启步骤:

?  在 INSTALLED_APPS 设置中取消 "django.contrib.admin" 的注释。

?  运行python manage.py syncdb更新数据库。

?  编辑你的 mysite/urls.py,如下:

from django.conf.urls import patterns,include, url

 

# Uncomment the next two lines to enablethe admin:

from django.contrib import admin

admin.autodiscover()

 

urlpatterns = patterns('',

   # Examples:

   # url(r'^$', '{{ project_name }}.views.home', name='home'),

   # url(r'^{{ project_name }}/', include('{{ project_name }}.foo.urls')),

 

   # Uncomment the admin/doc line below to enable admin documentation:

   # url(r'^admin/doc/', include('django.contrib.admindocs.urls')),

 

   # Uncomment the next line to enable the admin:

    url(r'^admin/',include(admin.site.urls)),

)

 

启用开发服务器

 

python manage.py runserver 192.168.4.13:8000

现在,用浏览器打开http://192.168.4.13:8000/admin/。你将看到管理登录界面:

你将看到一些可编辑的内容,包括groups ,users 和 sites 。这些都是 Django 默认自带的核心功能。

在管理网站中管理polls

需要在polls中添加admin.py开启polls的管理接口。

fromdjango.contribimportadmin

frompolls.modelsimportPoll

 

admin.site.register(Poll)

需要重启开发服务器。通常情况下,你每次修改文件后服务器都会自动载入,但是创建新文件却不会触发自动载入。注意启动之前要执行pythonmanage.py syncdb来创建表django_admin_log。

探索管理功能

点击“Polls”,可以看到投票列表。有个前面创建的投票:“What’s up?”:

点击这个”What’sup?”的投票进行编辑:

注意:

§  这的表单是根据 Poll模型自动生成的。

§  不同模型的字段类型 (DateTimeField, CharField)会对应的相应的 HTML 输入控件。每种类型的字段在 Djaong管理网站都有合适的展示。

§  每个 DateTimeField 都有JavaScript快捷方式。日期有一个 “Today”快捷方式和弹出式日历,而时间有个 “Now”快捷方式和常用时间选项的弹出式窗口。

在页面的底部还为你提供了几个选项:

§  Save –保存更改并返回到投票列表。

§  Save and continue editing –保存更改并重新载入当前界面。

§  Save and add another –保存更改并载入新增页面。

§  Delete –显示删除确认页。

右上角的“History”可以看到通过 Django管理界面对此对象所做的全部更改的清单,包含有时间戳和修改人的姓名,修改内容等信息:

自定义管理表单

让我们来看看如何在编辑表单上给字段重新排序。将 admin.site.register(Poll) 这行替换成:

class PollAdmin(admin.ModelAdmin):

    fields=['pub_date', 'question']

admin.site.register(Poll,PollAdmin)

模式 –创建一个模型的管理对象,将它作为 admin.site.register() 方法的第二个参数传入。上面更改使得“Publication date”字段在 “Question”字段之前:

给字段分组:

class PollAdmin(admin.ModelAdmin):

    fieldsets = [

        (None,               {'fields': ['question']}),

        ('Date information',{'fields': ['pub_date']}),

    ]

admin.site.register(Poll, PollAdmin)

在 fieldsets 中每个元组的第一个元素就是字段集的标题。如下:

你可以为字段指定任意HTML类。Django提供了一个 "collapse" 类初始时收缩的方式显示字段。当字段很多时非常有用的

class PollAdmin(admin.ModelAdmin):

    fieldsets = [

        (None,               {'fields': ['question']}),

        ('Date information',{'fields': ['pub_date'], 'classes': ['collapse']}),

    ]

添加关联对象

第一种就像刚才 Poll 那样在管理网站上注册 Choice:

from polls.models import Choice

admin.site.register(Choice)

现在“Choices”在 Django管理网站上是可用的选项了。”Addchoice”表单看起来像这样:

该表单中,Poll字段是包含了数据库中每个投票的选择框。Django知道外键要展示为选择框。在本例中,选择框中仅存在一个投票。

另外请注意 Poll 末尾的“Add Another”(加号)链接。每个外键对象关联都有这个链接。当点击“Add Another” 时,你将会获得一个 “Add poll”表单的弹出窗口。如果你在窗口中添加了一投票并点击了“Save”按钮, Django 会将poll保存至数据库中并且动态的添加为你正在查看的“Add choice”表单中的已选择项。

这种方式很低效。如果在创建 Poll 对象时能够直接添加一批Choices那会更好。

移除对 Choice 模型的 register() 方法调用。然后,将 Poll 的注册代码:

from django.contrib import admin

from polls.models import Choice, Poll

 

class ChoiceInline(admin.StackedInline):

    model = Choice

    extra = 3

 

class PollAdmin(admin.ModelAdmin):

    fieldsets = [

        (None,               {'fields': ['question']}),

        ('Date information',{'fields': ['pub_date'], 'classes': ['collapse']}),

    ]

    inlines = [ChoiceInline]

 

admin.site.register(Poll, PollAdmin)

这将告诉Django: “Choice 对象在 Poll 管理页面中编辑。默认情况下,可以编辑3个choices的字段。

现在多了三个关联Choices表单,且每次你在 “Change”页修改已经创建的对象时,都会另外获得三个额外表单。

表单的底部,你会发现一个“Add another Choice”(加号)链接。点击会添加新的表单。如果想移除添加,你可以点击右上方的 X 。注意你不能移除原有的三个插槽。此图片中显示了新增的表单:

显示所有关联 Choice 对象的字段需要占用大量的屏幕空间。为此,Django提供了以表格方式显示内嵌有关联对象的方式;你只需要将 ChoiceInline 声明改为如下所示:

class ChoiceInline(admin.TabularInline):

    #...

右边的delete打勾则会删除制定行。

另外要特别注意编码,比如mysql中创建的数据库要支持utf-8.settings中要设置:TIME_ZONE= 'Asia/Shanghai'和LANGUAGE_CODE = 'zh-cn'。

自定义管理变更列表

现在管理变更列表显示如下:

默认情况下,Django显示的是每个对象 str() 的结果。但是若是我们能够显示每个字段的话有时会更有帮助的。使用 list_display 管理选项可以实现此功能,这是一个元组,包含了要显示的字段名,将会以列的形式在该对象的 changlsit 页上列出来:

class PollAdmin(admin.ModelAdmin):

    # ...

    list_display = ('question', 'pub_date')

还可以包含函数:

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

你可以点击列名对这些值进行排序 –除了 was_published_recently,因为不支持根据方法输出的内容的排序。还要注意方法的列名默认是函数名将下划线转为空格,每行的输出为字符串。

当然也可以修改:

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?'

再次编辑你的admin.py,给 PollAdmin类增加一个过滤器(筛选)功能:

list_filter = ['pub_date']

这就增加了一个 “过滤”的侧边栏,通过 pub_date 字段的值来筛选:

过滤类型取决于你需要筛选的字段类型。因为 pub_date 是一个 DateTimeField ,Django提供了对应的筛选选项:”任意日期”、“今天”、“过去7天”、“本月”、“今年”。

还可以增加搜索功能:

search_fields = ['question']

这样就在顶部增加了一个搜索框将搜索 question 字段。你可以使用任意数量的字段,但是因为它在后台用 LIKE 查询,为了性能请尽量合理使用。

因为 Poll 对象有日期,根据日期向下排列也很方便。

date_hierarchy = 'pub_date'

这在顶部增加了基于日期的分层导航功能。在最顶层,显示所有可用年份,然后细化到月份,最终到天。

另外修改列表提供了分页功能。默认每页显示 100条记录。

自定义管理界面的外观

每个管理页面顶部有“Django管理”字样,我们可以修改Django的模板替换它。

自定义你的 项目 模板

在project目录下创建一个 templates 目录。模板可以放在文件系统中任何Diango能访问地方。但在你的project中保存模板是一个好习惯。

在配置文件中指明模板的目录:

TEMPLATE_DIRS = (
    '/path/to/mysite/templates', # 将此处改为你的目录。
)

目录Django建议配置为绝对路径。但是为适应GAE,SAE等,建议使用相对路径。比如:'../mysite/templates'。

在templates 下面新建admin目录,拷贝默认的base_site.html到admin目录。base_site.html一般在django/contrib/admin/templates/admin/base_site.html,比如我这:/usr/lib/python2.7/site-packages/django/contrib/admin/templates/admin/base_site.html

通过如下命令也可以查找到源码路径:

python -c "
import sys
sys.path = sys.path[1:]
import django
print(django.__path__)"

替换“site-name”部分为你想要的标题就好。

该模板包含了大量的文本,比如 {% block branding %} 和 {{ title }}。{% 和 {{ tags是Django模板语言的一部分,暂时不深究。

注意Django默认管理模板都是可覆盖的。要覆盖一个模板,只需要像刚才处理 base_site.html 一样 –从默认的目录下复制到你的自定义目录下,并修改它。

自定义你的 应用 模板

如果没有设置TEMPLATE_DIRSDjango会自动在应用的包内查找 templates目录,作为备用,django.contrib.admin就是是一个应用。

对于复杂的应用,建议把模板放置在应用目录。

更多关于Django查找模板的方式请参考  template loader documentation 。

自定义管理网站的首页

默认情况下,会显示INSTALLED_APPS 中所有注册了管理功能的应用,并按字母排序。自定义的模板是 admin/index.html 。里面有个一个名为 app_list 的模板变量包含了已安装的Django应用。当然也可以强行链接到特定对象的管理页面而不使用默认模板。

热点排行