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 }} 當前歸屬:{{ d.owner }}</li> {% endfor %} </ul> </div> </div> </div> {% endblock %}
