前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Django默认管理后台开发的一些技巧总结(一)

Django默认管理后台开发的一些技巧总结(一)

作者头像
IT不难
发布2023-11-17 13:49:41
1630
发布2023-11-17 13:49:41
举报
文章被收录于专栏:IT不难技术家园IT不难技术家园

前言

Django在开发管理系统的过程中,给客户用的前台配合hAdmin很快就搞好了。默认后台平时自己用,也没那么多讲究。这次要给别人用。就需要考虑权限,还有一些样式啥的。需要花点心思美化一下。

lk41ilfq.png
lk41ilfq.png

过程

限制后台的一些功能,记录只能由前端上传,禁止后台编辑和修改。加载自定义js,通过js提交数据

admin.py

编辑项目目录下的admin.py

代码语言:javascript
复制
class FundRecordAdmin(admin.ModelAdmin):
    #后台展示字段
    list_display = ['id', 'show_card_transid', 'show_card_number', 'record_type', 'amount', 'currency', 'pos_amount', 'pos_currency', 'status', 'auth_at', 'operate']

    readonly_fields = [field.name for field in FundRecord._meta.fields]

    #搜索字段
    search_fields=['card__card_number', 'card__card_transid']

    #禁用删除
    def has_delete_permission(self, request, obj=None):
        return False

    #禁止后台新增
    def has_add_permission(self, request):
        return False

    #卡片标识
    @admin.display(description='transid', ordering='id')
    def show_card_transid(self, obj):
        return obj.card.card_transid

    #卡号
    @admin.display(description='卡号', ordering='id')
    def show_card_number(self, obj):
        return obj.card.card_number

    # 定义一些操作示例
    @admin.display(description='操作', ordering='id')
    def operate(self, obj):
        if obj.status == 0:
            #拒绝按钮
            raras = "'{}','{}'".format(obj.id, '2')
            refuse_btn = "拒绝"

            #通过
            aaras = "'{}','{}'".format(obj.id, '1')
            allow_btn = "通过"

            html_str = "" + allow_btn + refuse_btn +""
            return format_html(html_str, r_a=raras, a_a=aaras)
        else:
            return ""

    class Media:
          js = ('js/fundrecord.js',)

#注册
admin.site.register(FundRecord, FundRecordAdmin)

fundrecord.js

调用js,给自定义按钮。然后通过接口传递数据。

代码语言:javascript
复制
//卡片额度处理函数
//fundrecordmanage函数传入申请aid和sta两个参数
//fid 申请ID
//sta 1已完成,2未通过
function fundrecordmanage(fid, sta){
    var url = "/record/fundman/?fid="+fid+"&sta="+sta;
    var Http = new XMLHttpRequest();
    Http.open("GET", url, false);
    Http.send(null);
    //console.log(Http.responseText);
}

view.py

定义供js使用的接口。包括给卡片充值,提现。接口只允许管理员使用,验证登录。采用事物保证数据的一致性。用messages提示。

代码语言:javascript
复制
@user_passes_test(lambda u: u.is_superuser)
@login_required
@transaction.atomic
def fundrecord_manage(request):
    """
    卡片额度变更处理函数
    """
    app_id = request.GET.get('fid')
    status = request.GET.get('sta')

    fundrecord = FundRecord.objects.filter(id=app_id,status=0).first()
    if fundrecord:
        if status == '1':
            #卡片充值
            if fundrecord.record_type == 1:
                try:
                    with transaction.atomic():
                        #修改记录状态
                        fundrecord.status = int(status)
                        fundrecord.save()

                        fundrecord.card.limit_amount += fundrecord.amount
                        fundrecord.card.remaining_amount += fundrecord.amount
                        fundrecord.card.note=""
                        fundrecord.card.save()

                        #通知
                        messages.success(request, '通过')
                except Exception as e:
                    logger.debug(e)
            #卡片提现
            elif fundrecord.record_type == 3:
                try:
                    with transaction.atomic():
                        #修改记录状态
                        fundrecord.status = int(status)
                        fundrecord.save()

                        #卡片说明
                        fundrecord.card.note=""
                        fundrecord.card.save()

                        #账号余额变动
                        # 创建一条退款记录,将预扣款返回账号
                        balance_record_a = BalanceRecord.objects.create(
                            owner=fundrecord.card.owner,
                            record_type=2,
                            amount=fundrecord.amount,
                            status=1,
                        )

                        fundrecord.card.owner.userprofile.usd_amount += fundrecord.amount
                        fundrecord.card.owner.userprofile.save()

                        #扣除提现手续费
                        service_fee = fundrecord.amount*Decimal(0.01)
                        if service_fee < 1:
                            service_fee = Decimal(1)

                        #扣除手续费
                        balance_record_b = BalanceRecord.objects.create(
                            owner=fundrecord.card.owner,
                            record_type=8,
                            amount=service_fee,
                            status=1,
                        )

                        #账号余额变动
                        balance_record_b.owner.userprofile.usd_amount -= service_fee
                        balance_record_b.owner.userprofile.save()

                        #通知
                        messages.success(request, '通过')
                except Exception as e:
                    logger.debug(e)
        elif status == '2':
            #卡片充值
            if fundrecord.record_type == 1:
                try:
                    with transaction.atomic():
                        # 创建一条退款记录,将预扣款返回账号
                        balance_record_a = BalanceRecord.objects.create(
                            owner=fundrecord.card.owner,
                            record_type=2,
                            amount=fundrecord.amount,
                            status=1,
                        )

                        fundrecord.card.owner.userprofile.usd_amount += fundrecord.amount
                        fundrecord.card.owner.userprofile.save()

                        #修改记录状态
                        fundrecord.status = int(status)
                        fundrecord.save()

                        #卡片说明
                        fundrecord.card.note=""
                        fundrecord.card.save()

                        #通知
                        messages.warning(request, '未通过')
                except Exception as e:
                    logger.debug(e)

            #卡片提现
            elif fundrecord.record_type == 3:
                 try:
                    with transaction.atomic():
                        #额度恢复
                        fundrecord.card.limit_amount += fundrecord.amount
                        fundrecord.card.remaining_amount += fundrecord.amount

                        #清理锁定
                        fundrecord.card.note=""
                        fundrecord.card.save()

                        #改变本条记录状态
                        fundrecord.status = int(status)
                        fundrecord.save()

                 except Exception as e:
                    logger.debug(e)


    return HttpResponse('ok')
本文参与?腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023年07月15日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客?前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 过程
    • admin.py
      • fundrecord.js
        • view.py
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
        http://www.vxiaotou.com