• 在admin中添加自定义actions并填写自定义参数


    https://www.hoboes.com/Mimsy/hacks/django-actions-their-own-intermediate-page/

        class 模型管理类(admin.ModelAdmin):
            actions = ['自定义方法名']
        #下面以行政部分发放多个办公用具给某领用人的操作来说明
        #定义一个选择员工的页面form,将来在动作中选择执行时会跳转到模板页面,同时填写参数,这里是选择员工
        class StaffSelectForm(forms.Form):
            #下面是获取选择的记录
            _selected_action = forms.CharField(widget=forms.MultipleHiddenInput)
            #这里是将来要选择的员工处,本方法就是要通过它传参
            _staff = forms.ModelChoiceField(Staff.objects, label='员工')
    
        def 自定义方法名(self, request, queryset):
            form = None
            print(request.POST)
            if 'cancel' in request.POST:
                self.message_user(request, '设备出库取消')
                return
            elif '_staff' in request.POST:
                form = self.StaffSelectForm(request.POST)
                if form.is_valid():
                   #这里从form中获取到传过来的参数_staff
                    staff = form.cleaned_data["_staff"]
                    print(request.POST.getlist(admin.helpers.ACTION_CHECKBOX_NAME))
                    for q in queryset:
                        #这里对要进行的操作自定义编写
                       #我这里是把选择的记录当前领取人作了修改
                        q.owner = staff
                        q.save()
                    self.message_user(request, f'{staff}成功领取{queryset.count()}台设备')
                    return HttpResponseRedirect(request.get_full_path())
            if not form:
                #这里是点击执行自定义动作时初始化form表单
                #把选择的记录值传过去前端页面
                form  = self.StaffSelectForm(initial={'_selected_action': request.POST.getlist(admin.helpers.ACTION_CHECKBOX_NAME)})
                return render(
                    request,
                    'APP名称/对应的自定义模板.html',
                    {'devs': queryset, 'form': form, 'path':request.get_full_path(), 'action': '自定义方法名', 'title': u'文具批量领取'}
    
                )
        自定义方法名.short_description = "批量领取"                          

    2、对应在的自定义动作模板:modify_owner.html

    #继承默认模板,统一样式
    {% extends "admin/base_site.html" %}
    {% block extrahead %}
    {{ block.super }}
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" rel="stylesheet">
    <style>
      .div_content {
        width: 100%;
        text-align: center;
      }
    #自定义样式
    </style>
    {% endblock %}
    {% block content %}
      <div class='container'>
        <div class="row">
        <form method="POST", action="{{ path }}">
          {% csrf_token %}
          {{ form.as_p }}
          <!-- 下面是手动显示字段,方便精准控件显示 -->
          <!-- {% for field in form %}
            <div class="row margin-top">
              <div class="col-md-6 text-right">{{ field.label_tag }}</div><div class="col-md-6 text-left">{{ field }}</div>
            </div>
          {% endfor %} -->
          <p class="row text-center margin-top" style="padding-left: 150px;">
            <input type="hidden" name="action" value="{{ action }}" />
            <input type="submit" class="btn btn-info btn-sm" name="ok" value="确 认" />
            <input type="submit" class="btn btn-info btn-sm margin-left" name="cancel" value="取 消" />
            
          </p>
        </form>
      </div>
    #以下是非关键代码,我这里是列出选择了哪些项,所以后端传过来的参数“devs”
        <div class="row">
          <div class="col-md-3 col-md-offset-6">
            <div class="text-center">
              <p style="font-size: 14px; font-weight: bolder;">出库设备信息所下:</p>
            </div>
            <ul>
              {% for d in devs %}
                <li>{{ d.devNO }}&nbsp;当前归属:{{ d.owner }}</li>
              {% endfor %}
            </ul>
          </div>
        </div>
      </div>
    {% endblock %}
  • 相关阅读:
    漫画 | 一台Linux服务器最多能支撑多少个TCP连接(非常重要)
    http请求与http响应
    gin BindJSON
    Joplin开源笔记软件使用入门
    使用pyttsx3实现简单tts服务
    07 | 哨兵机制:主库挂了,如何不间断服务?
    08 | 哨兵集群:哨兵挂了,主从库还能切换吗?
    30 | 如何使用Redis实现分布式锁?
    06 | 数据同步:主从库如何实现数据一致?
    0405 | AOF日志:宕机了,Redis如何避免数据丢失?
  • 原文地址:https://www.cnblogs.com/ameile/p/13858268.html
Copyright © 2020-2023  润新知