2017-08-14 135 views
1

管理行動似乎在django管理界面的列表視圖中選擇了若干項工作:單個對象Django管理操作

在我的情況,我想對改變一個簡單的動作按鈕(一個項目)視圖。

有沒有辦法使django管理員操作在那裏可用?

我知道我可以通過轉到列表視圖來解決這個問題,並在那裏選擇一個項目。但直接可用它會更好。

回答

7

在你的應用程序模型創建一個模板。

templates/admin/<yourapp>/<yourmodel>/change_form.html 

有了這個示例的內容來添加一個按鈕,當改變一個現有的對象。

{% extends "admin/change_form.html" %} 
{% block submit_buttons_bottom %} 
    {{ block.super }} 
    {% if original %} {# Only show if changing #} 
     <div class="submit-row"> 
      <a href="{% url 'custom-model-action' original.pk %}"> 
       Another action 
      </a> 
     </div> 
    {% endif %} 
{% endblock %} 

將該操作鏈接到任何URL並重定向回您的模型更改對象視圖。 More information about extending admin templates

更新:新增完整的常見使用自定義操作現有對象

urls.py

urlpatterns = [ 
    url(r'^custom_model_action/(?P<object_pk>\d+)/$', 
     core_views.custom_model_action, name='custom-model-action') 
] 

views.py

from django.contrib import messages 
from django.http import HttpResponse, HttpResponseRedirect 

def custom_model_action(request, object_pk): 
    messages.info(request, 'Performed custom action!') 
    return HttpResponseRedirect(
     reverse('admin:<yourapp>_<yourmodel>_change', args=[object_pk]) 
    ) 
1

如果你真的需要每一個對象,我建議你使用此解決方案,如:

class Gallery(TimeStampedModel): 
    title = models.CharField(max_length=200) 
    attachment = models.FileField(upload_to='gallery/attachment/%Y/%m/%d') 

    def __str__(self): 
     return self.title 

    def process_button(self): 
     return ('<button id="%(id)s class="btn btn-default process_btn" ' 
       'data-value="%(value)s>Process</button>' % {'id': self.pk, 'value': self.attachment.url}) 
    process_button.short_description = 'Action' 
    process_button.allow_tags = True 

在你admin.py,插入process_buttonlist_display;

class GalleryAdmin(admin.ModelAdmin): 
    list_display = ['title', 'process_button', 'created'] 
    search_fields = ['title', 'pk'] 
    .... 

    class Media: 
     js = ('path/to/yourfile.js',) 

然後,裏面yourfile.js,你也可以處理它..

$('.process_btn').click(function(){ 
    var id = $(this).attr('id');  // single object id 
    var value = $(this).data('value'); // single object value 
    ... 
}); 

希望它有幫助..

0

的內置上在管理操作中對查詢集進行操作。

您可以使用您的whant行動calable或顯示別的東西:

class ProductAdmin(admin.ModelAdmin): 
    list_display ('name') 
    readonly_fields('detail_url) 


def detail_url(self, instance): 
    url = reverse('product_detail', kwargs={'pk': instance.slug}) 
    response = format_html("""<a href="{0}">{0}</a>""", product_detail) 
    return response 

或使用形式

class ProductForm(forms.Form): 
    name = forms.Charfield() 

    def form_action(self, product, user): 
     return Product.value(
      id=product.pk, 
      user= user, 
     ..... 

     ) 


@admin.register(Product) 
class ProductAdmin(admin.ModelAdmin): 

# render buttons and links to 
def product_actions(self, obj): 
     return format_html(
      '<a class="button" href="{}">Action1</a>&nbsp;' 
      '<a class="button" href="{}">Action 2</a>', 
      reverse('admin:product-action-1', args=[obj.pk]), 
      reverse('admin:aproduct-action-3', args=[obj.pk]), 
     ) 

for more details about using forms