2011-07-14 42 views
14

我通過admin.py.I添加了管理員操作send_EMAIL當管理員使用時需要send_EMAIL對於選定用戶的操作,它應顯示包含所有選定用戶的中間頁面並要求確認。我的情況下,它要求確認,但當我點擊「發送電子郵件」按鈕什麼也沒有發生,我回到了change_list視圖沒有send_EMAIL行動被調用。使用Django admin的問題使用中間頁面的操作

Admin.py

class MyUserAdmin(UserAdmin): 
    list_display = ['username', 'email', 'first_name', 'last_name', 'is_active', staff] 
    list_filter = ['groups', 'is_staff', 'is_superuser', 'is_active'] 
    actions = ['send_EMAIL'] 


    def send_EMAIL(self, request, queryset): 
     from django.core.mail import send_mail 
     if 'apply' in request.POST: 
      for i in queryset: 
       if i.email: 
        send_mail('Subject here', 'Here is the message.', '[email protected]',[i.email], fail_silently=False) 
       else: 
      self.message_user(request, "Mail sent successfully ") 
     else: 
      from django.http import HttpResponse 
      from django.template import RequestContext, loader 
      t = loader.get_template('admin/send_mail.html') 
      c = RequestContext(request, {'articles': queryset}) 
      return HttpResponse(t.render(c),) 



admin.site.unregister(User) 
admin.site.register(User, MyUserAdmin) 

模板/ send_mail.html

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

{% block content %} 


<form action="" method="post">{% csrf_token %} 

    <p>The mail will be send to following users:</p> 

    <ul>{{ articles|unordered_list }}</ul> 

    <input type="hidden" name="action" value="send_EMAIL" /> 
    <input type="submit" name="apply" value="Send Email" /> 
</form> 

{% endblock %} 

對不起,我的英文不好.Plz幫助

+0

'queryset'從哪裏來?這是什麼urlconf條目? –

+0

我參考http://www.jpichon.net/blog/2010/08/django-admin-actions-and-intermediate-pages/)實現中間頁面>我真的不知道多少關於Django,所以我發佈了這個問題。 – Anshul

回答

23

我發現了一個簡單的方法來做到這一點。它爲我工作...我希望它可以幫助:

你需要做的是「選擇」的項目「傳遞」到確認頁面,幷包括他們的形式以及包括<input type="hidden" name="action" value="admin_action" />,以便django管理員知道它應該仍然叫admin actionpost只是爲了知道是否處理查詢集或呈現確認頁面。

# Write your admin action. 
# IMPORTANT: Note the context passed to TemplateResponse 

from django.contrib.admin import helpers 
from django.template.response import TemplateResponse 

class MyModelAdmin(admin.ModelAdmin): 
    def admin_action(self, request, queryset): 
     if request.POST.get('post'): 
      # process the queryset here 
     else: 
      context = { 
       'title': _("Are you sure?"), 
       'queryset': queryset, 
       'action_checkbox_name': helpers.ACTION_CHECKBOX_NAME, 
      } 
      return TemplateResponse(request, 'path/to/template.html', 
       context, current_app=self.admin_site.name) 

# The template 
{% extends "admin/base_site.html" %} 
{% load i18n l10n %} 

{% block content %} 
<form action="" method="post">{% csrf_token %} 
    <p>The following videos will be accepted:</p> 

    <ul>{{ queryset|unordered_list }}</ul> 

    <div> 
    {% for obj in queryset %} 
    <input type="hidden" name="{{ action_checkbox_name }}" value="{{ obj.pk|unlocalize }}" /> 
    {% endfor %} 
    <input type="hidden" name="action" value="admin_action" /> 
    <input type="hidden" name="post" value="yes" /> 
    <input type="submit" value="{% trans "Yes, I'm sure" %}" /> 
    </div> 
</form> 
{% endblock %} 
+0

這個{%for queryset%}中的obj可以工作。但對我來說這是黑魔法。任何人都知道爲什麼它有效? – theannouncer

+0

這是添加一個隱藏的表單輸入,列出您打算更改的所有對象。 –

+0

黑暗魔法是什麼,它爲什麼沒有它的第一頁。 –

相關問題