在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 %}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM