Django中使用UpdateView修改数据后,返回列表页

在数据维护类应用中,一般的做法是首先会显示一个列表页,用户可以选择列表页中的某一个数据进行操作。比如修改的处理,用户选中一个数据项后,应用会引导用户到数据修改页面,修改完毕后再返回列表页。

Django已经内置了很多有用的功能帮我们实现类似的功能。使用ListView显示数据列表,使用UpdateView实现数据修改功能....但是如果列表页是一个分页的数据,修改后应该返回到修改前的那一页才好。这时候使用Django内置的功能就不能满足要求了,所幸只需稍加调整即可:

首先,我们来在修改页面的模板中,增加一个隐含字段,记录上一个url:

<input type="hidden" name="__next__" value="{{ request.META.HTTP_REFERER }}">

 

其次,通过子类化UpdateView,并重写get_success_url来引用刚才加的保存上一页面的隐含字段: 

class UpdateView(UpdateView):
   def get_success_url(self):
       self.url = self.request.POST['__next__']
       return self.url

最后,在url配置中使用自定义的UpdateView替换原来的内置通用视图即可。

 

上边的方法仍有一个漏洞, 每次刷新/提交页面的时候request.META.HTTP_REFERER都会改变,因此我们需要在页面第一次加载的时候保存起来,因此最终的方案变为:

class UpdateView(UpdateView):
    def get_context_data(self, **kwargs):
        context = super(UpdateView,self).get_context_data(**kwargs)
        if '__next__' in self.request.POST:
            context['i__next__'] = self.request.POST['__next__']
        else:
            context['i__next__'] = self.request.META['HTTP_REFERER']
        return context
    def get_success_url(self):
        self.url = self.request.POST['__next__']
        return self.url

模板中的保存的__next__的代码变为:

<input type="hidden" name="__next__" value="{{ i__next__ }}">

返回的链接直接可以修改为: 

<a class="btn" href="{{ i__next__ }}">取消</a>

转载于:https://www.cnblogs.com/Ankh/archive/2012/10/06/2712751.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值