使用Django管理员操作与中间页面的问题 [英] Problem using Django admin Actions with intermediate pages
问题描述
我通过admin.py添加了一个管理操作send_EMAIL。我希望管理员对所选用户使用 send_EMAIL 操作时,应该显示所有选定用户的中间页面,并要求确认。在我的情况下请求确认,但是当我点击发送电子邮件按钮没有任何反应,我已经返回到change_list视图,没有send_EMAIL操作被调用。
I added an admin action send_EMAIL through admin.py.I want when admin uses send_EMAIL action for selected users it should show an intermediate page with all selected users and ask for confirmation.In my case it ask for confirmation but when I click on "send Email" button nothing happens and i got returned to change_list view without send_EMAIL action got called.
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.', 'from@example.com',[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 help
Sorry for bad english .Plz help
推荐答案
我找到了一个简单的方法。它对我有用...我希望它有助于:
I found an easy way to do it. It worked for me... I hope it helps:
您需要做的是将选定的项目传递到确认页面,并将它们包含在表单中以及包含< input type =hiddenname =actionvalue =admin_action/>
,以便django管理员知道它仍然应该调用 admin action
。 post
只是要知道是处理查询集还是呈现确认页面。
What you need to do is to "pass" the selected items to the confirmation page and include them in the form as well as including the <input type="hidden" name="action" value="admin_action" />
so that django admin knows that it should still call an admin action
. The post
is just to know whether to process the query set or render the confirmation page.
# 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 %}
这篇关于使用Django管理员操作与中间页面的问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!