2010-05-10 16 views
33

Her ne sebeple olursa olsun bunun kolay olacağını düşündüm, ancak daha derinlemesine baktım ve kullanıcıların bir örneğin "değiştir" görünümünde özel yönetim eylemleri yürütmesine izin vermenin kolay bir yolu yok gibi görünüyor (yani sadece görüntülediğinizde tek bir örnek için düzenleme ekranı, örneklerin listesi değil).Özel "Django admin" eylemlerinin "değişiklik listesi" görünümüne ek olarak "değişiklik" görünümünde görünmesinin bir yolu var mı?

Bunu yapmanın kolay bir yolunu mu görüyorum? Veya yönetici şablonlarından birini (ve muhtemelen ModelAdmin.add_view yöntemini) geçersiz kılmak için tek seçeneğim nedir? Yaptıklarımı

cevap

2

kendi MYAPP/templates/yönetici/MYMODEL/change_form.html şablon oluşturmak oldu: Ben temelde sadece blok "nesne araçları" olarak değiştirildi

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

tarih-link ve "sitede görüntüle" -link vardır. orijinal change_form.html dosyasının geri kalanı el değmeden kalır. BTW: "original.id", düzenlediğiniz modelin kimliğidir.

+0

teşekkürler. Kendi çözümümüzü yayınlamayı bitirdim, ama yorumunuz aslında sadece onu emmeye ve şablonu genişletmeye ihtiyacım olduğunu anlamama yardımcı oldu. – jsdalton

10

Yaptığım şey şu:

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 
    }) 

Temelde biz sadece eylemleri değişiklik görünümünde açılır menüsünü doldurmak için gerekli verileri topluyoruz şu şekildedir:

Birincisi, ModelAdmin nesnenin change_view uzatıldı.

Sonra ben sadece söz konusu model için change_form.html uzatıldı:

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

Bu yönetici eylemleri bölüm değişim listesi görünümünde çıkılır nasıl hemen hemen aynıdır. Ana farklar şunlardır: 1) hangi formun değiştirilmesi gerektiğini belirlemek için bir onay kutusu yerine, 2), form için bir URL belirtmek zorundaydı, değer gizli bir form alanı ile ayarlanır ve 3) Değişim listesi görünümü için CSS'yi ekledim ve #changelist kimliğine sahip bir div içindeki eylemleri taktım - böylece kutu yarı yolda kalıyordu.

Mükemmel bir çözüm değil, ancak tamam çalışıyor ve ekleyebileceğiniz ek işlemler için ek bir yapılandırma gerektirmiyor.

18

this yanıtının güncellenmesi ve iyileştirilmesi. Django 1.6 ile çalışır ve geldiğiniz yere yönlendirir.

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): 
    ...... 

Şablon:

{% 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 ve ActionInChangeFormMixin burada eşleşmelidir. Ayrıca: django.http import HttpResponseRedirect – pdenya

+0

Bu beni kurtardı ve Django 1.7 de çalışıyor. –

İlgili konular