给Django Admin增多自定义的视图函数

给Django Admin增加自定义的视图函数

学习http://www.beardygeek.com/2010/03/adding-views-to-the-django-admin/后记录

增加url

有两种方法可以给admin增加url.

方法一,直接在urls.py文件增加,具体操作如下:

(r'^admin/mypage/$', 'myapp.views.my_admin_view'),
(r'^admin/', include(admin.site.urls)),
 

要注意的是必须使用增加的url放在真正的admin urls之前.

方法二,会难一点.通过扩展AdminSite的get_urls()函数,来增加url.

 

View

写view时必须要使用staff_member_required装饰器

from django.contrib.admin.views.decorators import staff_member_required
...
@staff_member_required
def my_admin_view(request):
    # view code
 

当渲染view时,一定要将RequestContext传给模板.

return render_to_response('my_template.html',
  context_instance=RequestContext(request))
 

Template

为了使用自己view展现时更象在admin中,template须扩展自admin的base_site.html模板.

{% extends 'admin/base_site.html' %}
 

 

在模板中还得加入i18n的支持与增加admin media

{% load i18n adminmedia %}
 如果你要增加额外的style,模板中可以使用{% block extrastyle %}.把要增加的javascript放在

 

{% block extrahead %}中

{% load i18n adminmedia %}
 

增加form date widgets

在页面中有包含date字段的form,可以使用admin的form widgets.

from django.contrib.admin import widgets

class AdminForm(forms.Form):
    start_date = forms.DateField(label="Start date",
         widget=widgets.AdminDateWidget())
 

 

然后在模板中增加extrahead block.

<script type="text/javascript" src="/admin/jsi18n/"></script>
<script type="text/javascript" src="/admin-media/js/core.js"></script>
{{ form.media }}
 

 

在extra styles block中增加admin form css:

 

{{ block.super }}
<link rel="stylesheet" type="text/css" href="/admin-media/css/forms.css" />
 

 

Breadcrumbs

{% block breadcrumbs %}<div class="breadcrumbs"><a href="/admin/">
{% trans "Home" %}</a> > My View</div>{% endblock %}
 

 

在admin index增加链接

 

在index最近动作上方上方增加一个链接.为了做这个,虽重载admin的index.htm

 

在自己的app中templates文件夹中创建一个名为admin的文件夹,然后从django/contrib/admin/templates/中复制文件index.html到这个新建的文件夹中.

在这个文件中,可以看到一个名为"sidebar"的块,在"content-related" div下,放入以下的模板代码:

<div class="module">
  <h2>Admin tools</h2>
    <ul class="actionlist">
      <li class="changelink">
        <a href="/admin/mypage/">My View</a>
      </li>
    </ul>
</div>
 

一切OK