2016-01-20 120 views
9

我已經爲我的模型定義了一個自定義的管理操作,它可以按預期完美工作。我還着眼於在SO上添加一個按鈕到管理變更頁面的多種方式。只有我缺少的步驟是如何使更改頁面中的按鈕執行我的自定義管理操作與當前對象。Django:如何將自定義按鈕添加到管理更改執行管理操作的表單頁面?

目標是允許管理員單獨檢查每個對象並對它們執行操作,而無需返回列表視圖,選擇檢查對象並從列表中執行操作。

我定製的管理操作是這樣的:

def admin_apply_change(modeladmin, request, queryset): 
    # loop over objects in query set and perform action 

我假設有調用管理變化的形式這個動作,其中queryset將只包含簡單和乾淨的方式當前打開的對象管理員正在看。

注意:如果按鈕是在變化形式的底部,旁邊Save按鈕,而不是在頂部History是這是不是很明顯這將是preferrable。

解決方案

爲解決一看便知通過Remi。爲了使其發揮作用需要以下更正:

1:在response_change初始化一些變量的覆蓋丟失:

opts = self.model._meta 
pk_value = obj._get_pk_val() 
preserved_filters = self.get_preserved_filters(request) 

2:新的包含標籤custom_submit_row應放置在templatetags而不是在管理員(請參閱docs for custom templatetags

3:這是您可能會放鬆一段時間的疏忽。在change_form.html你不僅要更改建議的行:

{% if save_on_top %}{% block submit_buttons_top %}{% submit_row %}{% endblock %}{% endif %} 

而且在底部更重要的線,其中submit_row出現:

{% block submit_buttons_bottom %}{% submit_row %}{% endblock %} 

(它正好位於change_form.html的JavaScript塊以上)

回答

13

您可以查看change_form_template並將其設置爲您的自定義模板並覆蓋response_change方法:

class MyModelAdmin(admin.ModelAdmin): 

    # A template for a customized change view: 
    change_form_template = 'path/to/your/custom_change_form.html' 

    def response_change(self, request, obj): 
     opts = self.model._meta 
     pk_value = obj._get_pk_val() 
     preserved_filters = self.get_preserved_filters(request) 

     if "_customaction" in request.POST: 
      # handle the action on your obj 
      redirect_url = reverse('admin:%s_%s_change' % 
           (opts.app_label, opts.model_name), 
           args=(pk_value,), 
           current_app=self.admin_site.name) 
      redirect_url = add_preserved_filters({'preserved_filters': preserved_filters, 'opts': opts}, redirect_url) 
      return HttpResponseRedirect(redirect_url) 
     else: 
      return super(MyModelAdmin, self).response_change(request, obj) 
site-packages/django/contrib/admin/templates/change_form.html

複製change_form.html和編輯該行44

{% if save_on_top %}{% block submit_buttons_top %}{% submit_row %}{% endblock %}{% endif %} 

{% if save_on_top %}{% block submit_buttons_top %}{% custom_submit_row %}{% endblock %}{% endif %} 

同時檢查線路:

{% block submit_buttons_bottom %}{% submit_row %}{% endblock %} 

剛剛的JavaScript塊以上。

然後你就可以在你的admin.py地方註冊一個新的包含標籤或將其添加到templatetags:

@register.inclusion_tag('path/to/your/custom_submit_line.html', takes_context=True) 
def custom_submit_row(context): 
    """ 
    Displays the row of buttons for delete and save. 
    """ 
    opts = context['opts'] 
    change = context['change'] 
    is_popup = context['is_popup'] 
    save_as = context['save_as'] 
    ctx = { 
     'opts': opts, 
     'show_delete_link': (
      not is_popup and context['has_delete_permission'] and 
      change and context.get('show_delete', True) 
     ), 
     'show_save_as_new': not is_popup and change and save_as, 
     'show_save_and_add_another': (
      context['has_add_permission'] and not is_popup and 
      (not save_as or context['add']) 
     ), 
     'show_save_and_continue': not is_popup and context['has_change_permission'], 
     'is_popup': is_popup, 
     'show_save': True, 
     'preserved_filters': context.get('preserved_filters'), 
    } 
    if context.get('original') is not None: 
     ctx['original'] = context['original'] 
    return ctx 

custom_submit_line.html的內容:

{% load i18n admin_urls %} 
<div class="submit-row"> 
{% if show_save %}<input type="submit" value="{% trans 'Save' %}" class="default" name="_save" />{% endif %} 
{% if show_delete_link %} 
    {% url opts|admin_urlname:'delete' original.pk|admin_urlquote as delete_url %} 
    <p class="deletelink-box"><a href="{% add_preserved_filters delete_url %}" class="deletelink">{% trans "Delete" %}</a></p> 
{% endif %} 
{% if show_save_as_new %}<input type="submit" value="{% trans 'Save as new' %}" name="_saveasnew" />{% endif %} 
{% if show_save_and_add_another %}<input type="submit" value="{% trans 'Save and add another' %}" name="_addanother" />{% endif %} 
{% if show_save_and_continue %}<input type="submit" value="{% trans 'Save and continue editing' %}" name="_continue" />{% endif %} 

<input type="submit" value="{% trans 'Custom Action' %}" name="_customaction" /> 

</div> 

這是一個很大的代碼,但主要是複製/粘貼。希望有所幫助。

+0

謝謝。這解決了我的問題以及一些小的更正。在我的問題更新中看到它們。如果您可以更新您的答案以納入這些更正,那將會很好。 – dsalaj

3

大多數人可能會毫不猶豫地做到這一點,雖然從答案中不清楚,管理員變更表單應該簡單地擴展而不是完全覆蓋。

custom_change_form.html

{% extends "admin/change_form.html" %} 

{% if save_on_top %}{% block submit_buttons_top %}{% custom_submit_row %}{% endblock %}{% endif %} 

{% block submit_buttons_bottom %}{% custom_submit_row %}{% endblock %} 
相關問題