惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Forbes - Security
Forbes - Security
GbyAI
GbyAI
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
S
SegmentFault 最新的问题
Y
Y Combinator Blog
Recorded Future
Recorded Future
博客园 - Franky
I
InfoQ
T
The Blog of Author Tim Ferriss
Recent Announcements
Recent Announcements
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
博客园_首页
阮一峰的网络日志
阮一峰的网络日志
T
Tailwind CSS Blog
Cyberwarzone
Cyberwarzone
The Register - Security
The Register - Security
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
雷峰网
雷峰网
P
Palo Alto Networks Blog
G
GRAHAM CLULEY
Cloudbric
Cloudbric
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
MongoDB | Blog
MongoDB | Blog
F
Full Disclosure
Google DeepMind News
Google DeepMind News
Recent Commits to openclaw:main
Recent Commits to openclaw:main
C
Check Point Blog
爱范儿
爱范儿
The GitHub Blog
The GitHub Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
W
WeLiveSecurity
T
Threat Research - Cisco Blogs
U
Unit 42
N
Netflix TechBlog - Medium
The Cloudflare Blog
Spread Privacy
Spread Privacy
Microsoft Azure Blog
Microsoft Azure Blog
美团技术团队
T
Troy Hunt's Blog
Engineering at Meta
Engineering at Meta
H
Heimdal Security Blog
TaoSecurity Blog
TaoSecurity Blog
C
Cybersecurity and Infrastructure Security Agency CISA
T
Tenable Blog
B
Blog
S
Securelist
H
Hacker News: Front Page
Google Online Security Blog
Google Online Security Blog
G
Google Developers Blog

博客园 - jjxstudio

关于silverlight 前景的讨论,不吐不快 没有说说新的async ctp吗? 新blog地址 青春咖啡馆 2010 计划 axapta 断开的记录集 django 1.1 south 理解zope3 的适配器 准备放弃django openerp新的web-client openerp view design elements中的col和colspan - jjxstudio a中的this和element 上下文 怎样才算是一个好的windows forms 应用程序框架? django admin search_fields 今天的折腾 杭州:一个python的工作机会 ironpython的下一个版本
自定义django admin 之一
jjxstudio · 2008-12-04 · via 博客园 - jjxstudio

自定义django admin

说些不是django 文档中的东西,首先,一个Admin 类是继承自admin.ModelAdmin,这个类是个callable类,有一个__call__方法,下面是一个例子
    def __call__(self, request, url):

        if url is None:
            return self.changelist_view(request)
        if url.endswith('parameter'):
     
            return self.parameter_builder(request, url.split('/')[0])
        elif url.endswith('approve'):
            return self.approve(request, url.split('/')[0])
        return super(ProductAdmin, self).__call__(request, url)  

request就是HttpRequest,而url 在django admin中是admin_url/app_name/model_name/后面部分,在列表页面中,它是None, 在编辑窗体中,它通常就是model 的id,所以在这里,url.split('/')[0]就取得的model 的id

在admin.ModelAdmin中,参见django.contrib.admin.options,__call__方法根据url的不同转向不同的视图,他们分别是:如果url是None,转向changelist_view
add_view ,如果url是add,history_view 针对url结尾是/history,delete_view,如果url是以/delete结尾,其它,通通转向change_view. 你可以看到add_view,history_view,delete_view,change_view都是标准的django view,你可以覆盖这些view或是如上例,重载__call__,添加自定义的url进行处理

继续下去,add_view/change_view默认对应change_form.html,changelist_view对应change_list.html但这些均可以重载掉

class ProducAdmin(admin.ModelAdmin):
  change_form_template='你自己的change_form_template'
  change_list_template='你自己的列表模板 '
  delete_confirmation_template='你自己的删除确认模板'
  object_history_template='你自己的操作历史模板'

添加自己的url时,通常使用的是相对url的技巧,比方说在change_form中
<a href='parameter/'>参数</a>,则实际的url会是/admin_url/app_name/model_url/model_id/parameter/