2010-05-10 7 views
33

나는이 일을 쉽게 할 수있는 이유가 무엇인지 생각해 보았지만 좀 더 자세히 보았고 사용자가 인스턴스의 "변경"보기에서 사용자 지정 관리 작업을 실행할 수있는 직접적인 방법이없는 것으로 나타났습니다. 인스턴스 목록이 아닌 단일 인스턴스의 편집 화면).Django 사용자 지정 관리 작업을 "변경 목록"보기 외에 "변경"보기에도 표시 할 수있는 방법이 있습니까?

나는 쉬운 방법을 간과하고 있습니까? 또는 admin 템플릿 중 하나 (그리고 아마도 ModelAdmin.add_view 메소드)를 재정의하는 유일한 방법입니까? 내가 무슨 짓을

답변

2

내 자신의 MYAPP/템플릿/관리자/MYMODEL/change_form.html 템플릿을 생성했다 : 그래서 기본적으로 단지 블록 "객체 도구"로 변경

{% extends "admin/change_form.html" %} 
{% load i18n %} 
{% block object-tools %} 
{% if change %}{% if not is_popup %} 
<ul class="object-tools"> 
    <li><a href="{% url MY_COMMAND_VIEW original.id %}" class="historylink" >MY COMMAND</a></li> 
    <li><a href="history/" class="historylink">{% trans "History" %}</a></li> 
    {% if has_absolute_url %}<li><a href="../../../r/{{ content_type_id }}/{{ object_id }}/" class="viewsitelink">{% trans "View on site" %}</a></li>{% endif%} 
    </ul> 
{% endif %}{% endif %} 
{% endblock %} 

역사 - 링크와 "사이트에서보기"- 링크가 있습니다. 원래 change_form.html의 나머지 부분은 그대로 유지됩니다. BTW : "original.id"는 편집중인 모델의 ID입니다.

+0

감사합니다. 결국 내 솔루션을 게시했지만 귀하의 의견은 실제로 내가 그것을 빨아 들여 그 템플릿을 확장해야한다는 것을 알게되었습니다. – jsdalton

10

다음은 내가 한 일입니다.

def change_view(self, request, object_id, extra_context=None): 
    actions = self.get_actions(request) 
    if actions: 
     action_form = self.action_form(auto_id=None) 
     action_form.fields['action'].choices = self.get_action_choices(request) 
    else: 
     action_form = None 
    changelist_url = urlresolvers.reverse('admin:checkout_order_changelist') 
    return super(OrderAdmin, self).change_view(request, object_id, extra_context={ 
     'action_form': action_form, 
     'changelist_url': changelist_url 
    }) 

을 기본적으로 우리가 행동이 변화보기에 드롭 다운 채우는 데 필요한 데이터를 수집하고 다음과 같이

첫째, 나는 ModelAdmin 개체의 change_view을 확장했다.

그럼 난 그냥 문제의 모델 change_form.html 확장 :

{% extends "admin/change_form.html" %} 
{% load i18n adminmedia admin_list %} 

{% block extrastyle %} 
    {{ block.super }} 
    <link rel="stylesheet" type="text/css" href="{% admin_media_prefix %}css/changelists.css" /> 
{% endblock %} 

{% block object-tools %} 
    {{ block.super }} 
    <div id="changelist"> 
    <form action="{{ changelist_url }}" method="POST">{% csrf_token %} 
     {% admin_actions %} 
     <input type="hidden" name="_selected_action" value="{{ object_id }}"> 
    </form> 
    </div> 
{% endblock %} 

이 관리자의 작업 섹션은 변경 목록보기에 출력하는 방법과 거의 동일하다. 주요 차이점은 1) 양식을 게시 할 URL을 지정해야한다는 것, 2) 변경해야 할 개체를 지정하는 확인란 대신 숨겨진 양식 필드를 통해 값을 설정하는 것, 3) 나는 변경 목록보기를 위해 CSS를 포함 시켰고, ID가 #changelist 인 div에 작업을 붙였습니다. 상자가 중간 정도 괜찮은 것처럼 보일 것입니다.

좋은 해결책은 아니지만 문제가 없으며 추가 할 수있는 추가 작업이 필요하지 않습니다.

18

여기 업데이트 및 개선은 this입니다. 그것은 장고 1.6과 함께 작동하고 당신이 어디로 온지로 리디렉션합니다.

class ActionInChangeFormMixin(object): 
    def response_action(self, request, queryset): 
     """ 
     Prefer http referer for redirect 
     """ 
     response = super(ActionInChangeFormMixin, self).response_action(request, 
       queryset) 
     if isinstance(response, HttpResponseRedirect): 
      response['Location'] = request.META.get('HTTP_REFERER', response.url) 
     return response 

    def change_view(self, request, object_id, extra_context=None): 
     actions = self.get_actions(request) 
     if actions: 
      action_form = self.action_form(auto_id=None) 
      action_form.fields['action'].choices = self.get_action_choices(request) 
     else: 
      action_form = None 
     extra_context=extra_context or {} 
     extra_context['action_form'] = action_form 
     return super(ActionInChangeFormMixin, self).change_view(request, object_id, extra_context=extra_context) 

class MyModelAdmin(ActionInChangeFormMixin, ModelAdmin): 
    ...... 

템플릿 :

{% extends "admin/change_form.html" %} 
{% load i18n admin_static admin_list admin_urls %} 

{% block extrastyle %} 
    {{ block.super }} 
    <link rel="stylesheet" type="text/css" href="{% static "admin/css/changelists.css" %}" /> 
{% endblock %} 

{% block object-tools %} 
    {{ block.super }} 
    <div id="changelist"> 
    <form action="{% url opts|admin_urlname:'changelist' %}" method="POST">{% csrf_token %} 
     {% admin_actions %} 
     <input type="hidden" name="_selected_action" value="{{ object_id }}"> 
    </form> 
    </div> 
{% endblock %} 
+1

ActionAdminMixin과 ActionInChangeFormMixin이 일치해야합니다. 또한 django.http에서 가져 오기 HttpResponseRedirect – pdenya

+0

이것은 나를 구했고 Django 1.7에서도 작동합니다. –

관련 문제