在django admin的 change_view,  add_view和delete_view页面,如果想让页面完成操作后跳转到我们想去的url,该怎么做

默认django admin会跳转到changelist_view页面

------------------------------

下面的代码是django1.6的

下面是一个可行的做法,写admin model的时候重写父类admin.ModelAdmin的change_view 方法

from django.contrib import admin
class MyAdmin(admin.ModelAdmin):
def change_view(self, request, object_id, form_url='', extra_context=None):
result_template = super(MyAdmin, self).change_view(request, object_id, form_url, extra_context)
result_template['location'] = '/dest/url'
return result_template

可以看到,就是调用ModelAdmin的change_view得到结果,然后给 result_template做了一个这个操作

 result_template['location'] = '/dest/url'

然后返回

为什么这样可行? 我们看看发生了什么

我们重写change_view,当然参数必须和父类一样了

首先调用了父类ModelAdmin.change_view的这个函数,这个函数返回了什么呢

追溯一下源代码,它返回的是一个TemplateResponse对象, 是通过调用 ModelAdmin.render_change_form()

return TemplateResponse(request, form_template or [
"admin/%s/%s/change_form.html" % (app_label, opts.model_name),
"admin/%s/change_form.html" % app_label,
"admin/change_form.html"
], context, current_app=self.admin_site.name)

那么接下来我们看看TemplateResponse

其实有这样的派生关系: TemplateResponse <----  SimpleTemplage  <-----HttpRespone  <--- HttpResponseBase

HttpResponse里实现了

def __setitem__(self, header, value):
header = self._convert_to_charset(header, 'ascii')
value = self._convert_to_charset(value, 'latin-1', mime_encode=True)
self._headers[header.lower()] = (header, value)

而如果一个类实现了 __setitem__,  那么[] 操作符就会去调用这个函数(相当于C++中的重载)

result_template['location'] = '/dest/url'

所以上面这行代码就在服务器返回的Response的header中写入了location, 而浏览器收到的Http Response的header中如果有location,就会跳转到location指定的 url

-------------------------------------------------------

但是我还发现了一个现象, 当进入到一个model item的change_view界面时,也就是GET请求这个url,虽然服务端返回了location,但是浏览器没有跳转,可能是因为当前有form需要提交.

而在change_view界面修改完后, 点击提交表单,浏览器收到服务端的location后,就发生了跳转.

定制django admin页面的跳转的更多相关文章

  1. django admin页面样式丢失问题

    wamp 配置django admin页面样式丢失问题 第一种方法:在apache配置文件httpd.conf中加入如下代码:Alias /static "E:\Python27\Lib\s ...

  2. Django admin页面 显示中文问题

    http://127.0.0.1:8000/admin/ 该页中实现中文显示. 1.  页面显示的数据表表名 实现中文显示. models.Model类的内部类Meta,有两个特殊的选项:verbos ...

  3. Django admin 页面中文名称加s,去除s的设置

    class UserInfo(models.Model): #字段 #字段 #字段 class Meta: verbose_name_plural = '用户列表'

  4. 利用 Django admin 完成更多任务(转)

    利用 Django admin 完成更多任务   Django admin Django 为未来的开发人员提供了许多功能:一个成熟的标准库,一个活跃的用户社区,以及 Python 语言的所有好处.虽然 ...

  5. Django admin究竟要怎么写才优雅

    比如在Django admin 注册models时,会用到. 对于APP里自带的models,可以使用这种方式注册. from django.contrib import admin # Regist ...

  6. Django admin注册model究竟要怎么写才优雅 批量注册model

    比如在Django admin 注册models时,会用到. 对于APP里自带的models,可以使用这种方式注册. from django.contrib import admin # Regist ...

  7. Django admin注册model究竟要怎么写才优雅

    比如在Django admin 注册models时,会用到. 对于APP里自带的models,可以使用这种方式注册. from django.contrib import admin # Regist ...

  8. Django Admin定制

    Django内置的Admin是对于model中对应的数据表进行增删改查提供的组件,使用方式有: 依赖APP: django.contrib.auth django.contrib.contenttyp ...

  9. Django Admin 配置和定制基本功能(基本二次开发配置)

    一 列表显示页面  1. list_display,列表时,定制显示的列 @admin.register(models.UserInfo) class UserAdmin(admin.ModelAdm ...

随机推荐

  1. ubuntu16.04下安装Eigen

    请输入以下命令进行安装: sudo apt-get install libeigen3-dev 一个库由头文件和库文件组成.Eigen头文件的默认位置在 “usr/include/eigen3” 中. ...

  2. UVA 11776 - Oh Your Royal Greediness! - [贪心/模拟]

    题目链接:https://cn.vjudge.net/problem/UVA-11776 题意: 给出数字n(0<=n<=1000),代表有n个农民,接下来有n行,每行两个数字S和E代表这 ...

  3. JNUOJ 1180 - mod5

    首先,可以自己先一个超时的标程出来: #include<cstdio> typedef long long ll; ll n,m,cnt; int main() { int t; scan ...

  4. MySQL异步复制

    准备:主备库版本一致,正常安装软件. 1.主库上设置一个复制使用的账户: mysql> grant replication slave on *.* to 'rep1'@'192.168.100 ...

  5. Oracle体系结构之密码文件管理

    oracle密码文件主要用来控制sysdba和sysoper用户用于远程登录.通常,oracle用户登录database有两种方式,一种是通过本地操作系统验证登录,一种是通过密码文件验证登录. 操作系 ...

  6. less语言特性(二) —— 混合

    在 LESS 中我们可以定义一些通用的属性集为一个 class,然后在另一个 class 中去调用这些属性,下面有这样一个 class: 1 2 3 4 .bordered { border-top: ...

  7. windows安装并破解navicat.

    1:下载以下两个文件. patchNavicat.exe:  https://pan.baidu.com/s/1ZtV20GUGfZHcXHRTEb5tYg navicatforMysql.exe:  ...

  8. A + B Problem II(大数加法)

    一直格式错误,不想改了,没A #include <iostream> #include <stdio.h> #include <string.h> #include ...

  9. Hive的安装与配置

    1.因为我使用MySQL做为Hive的元数据库,所以先安装MySQL. 参考:http://www.cnblogs.com/hunttown/p/5452205.html 登录命令:mysql -h主 ...

  10. mysql主从数据库不同步的2种解决方法 (转载)

    今天发现Mysql的主从数据库没有同步 先上Master库: mysql>show processlist; 查看下进程是否Sleep太多.发现很正常. show master status; ...