django admin message 友好提示出错 save_model 很有用 只有增加和查看权限

class GiveProductAdmin(admin.ModelAdmin):
    list_display = ('rolename', 'server', 'product', 'status', 'logdate')
    readonly_fields = ('status', 'logdate')
    def has_delete_permission(self, request, obj=None):
        return False
    
    def has_change_permission(self, request, obj=None):
        """
        @des:注意这里虽然有修改权限,但是是为了查看,在save_model里面做修改,让其没有修改权限
        """
        return True
    
    def response_add(self, request, obj, post_url_continue=None):
        """
        @des:这里可以自定义 创建对象后的 出错信息-----修改对象用response_change, 删除对象用resonse_delete
        """
        #如果有出错消息
        if messages.get_messages(request):
            return HttpResponseRedirect(".")
        #end--如果没有出错消息
        return super(GiveProductAdmin, self).response_add(request, obj, post_url_continue)
    
    def response_change(self, request, obj):
        """
        @des:这里可以自定义 创建对象后的 出错信息-----修改对象用response_change, 删除对象用resonse_delete
        """
        #如果有出错消息
        if messages.get_messages(request):
            return HttpResponseRedirect(".")
        #end--如果没有出错消息
        return super(GiveProductAdmin, self).response_change(request, obj)
    
    def save_model(self, request, obj, form, change):
        """
        @des:修改本model的数据
        @超级坑: save_model是在事务里面执行的,所以,除了这个方法执行完后,才会有订单,订单记录等,被坑惨了, 就算transaction.savepoint_commit都不行
        """
        if change is False:#是创建--那么执行补单逻辑
            cp,cpname = 100, 'gpt' #手动补单的渠道
            #获取服务器对象
            Gs = get_model('ckauth', 'GameServer')
            serverORM = Gs.objects.get(id=obj.server)
            #end--获取服务器对象
            #判断玩家存不存在
            rolename = obj.rolename.encode('utf-8')
            req = urllib2.Request("http://%s:%s/getplayerbync1451xxx/" % (serverORM.ip,serverORM.hport))
            fd = urllib2.urlopen(req, urllib.urlencode({'pwd':'145278', 'nc':rolename}), timeout=5)
            rdata = fd.read()
            fd.close()
            rdata = json.loads(rdata)
            if rdata['s']!=1:
                messages.error(request, u'角色不存在')
                return
            rid,uid = rdata['rid'],rdata['uid']
            #end--判断玩家存不存在
            #创建订单
            oid = "%s" % ((uuid.uuid4()).hex,)
            oobj = Orderform.objects.create(
                orderId=oid,
                channel_number=cp,
                server=serverORM,
                roleId=rid,
                produce_id=obj.product,
                status=0
            )
            #end--创建订单
            #创建充值记录
            c_payobj = payforc.getItemById(obj.product)
            amount = int(c_payobj['c_pay'])
            real_ext = {'rid':rid, 'eid':obj.product, 'oid':oid}
            ext = "%s"%real_ext
            probj = PayRecord.objects.create(
                username=uid,
                gold=float(amount),
                orderId=oid,
                server=serverORM,
                status=0,
                ext=ext,
                channel_number=cpname
            )
#             #创建保存点
#             spid = transaction.savepoint()
#             transaction.savepoint_commit(spid)
#             #end--创建保存点
            #end--创建充值记录
            # 订单投递到对应游戏服务器发放代币
            req = urllib2.Request("http://%s:%s/sy/game/payRecord/" % (serverORM.ip,serverORM.hport))
            mm = hashlib.md5()
            mm.update("%s%s%s" % (oid, ext, settings.PAY_GAME_KEY))
            fd = urllib2.urlopen(req, urllib.urlencode({'oid': oid, 'ext': ext, 'flag': mm.hexdigest(), 'cp': cpname}), timeout=5)
            data = fd.read()
            fd.close()
            if int(data) != 1:
                obj.status=2
                messages.error(request, u'游戏服验证失败')
            else:
                obj.status=1
                oobj.status = 1
                probj.status = 1
                oobj.save()
                probj.save()
            # 返回状态代码给支付平台
            obj.save()
        else:#如果是修改,那么不允许修改
            messages.error(request, u'不允许修改')

分享到: 微信 更多