【问题标题】:Problem using Django admin Actions with intermediate pages使用带有中间页面的 Django 管理操作的问题
【发布时间】:2011-10-05 02:34:47
【问题描述】:

我通过 admin.py 添加了一个管理员操作send_EMAIL。当管理员对选定用户使用 send_EMAIL 操作时,我希望它显示一个包含所有选定用户的中间页面并要求确认。在我的情况下,它要求确认,但是当我点击“发送电子邮件”按钮时,没有任何反应,并且我返回到 change_list 视图,而没有调用 send_EMAIL 操作。

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)

templates/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 %} 

【问题讨论】:

  • queryset 来自哪里?这个的 urlconf 条目是什么?
  • 我参考jpichon.net/blog/2010/08/…) 来实现中间页面>我真的不太了解 Django,所以我发布了这个问题。

标签: python django django-admin django-templates


【解决方案1】:

我找到了一种简单的方法。它对我有用......我希望它有帮助:

您需要做的是将所选项目“传递”到确认页面并将它们包含在表单中以及包含&lt;input type="hidden" name="action" value="admin_action" /&gt;,以便 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 %}

【讨论】:

  • 这个 {% for obj in queryset %} 东西有效。但对我来说,它是黑魔法。有人知道它为什么起作用吗?
  • 它正在添加一个隐藏的表单输入,列出您打算更改的所有对象。
  • What's Dark Magic 是为什么它可以在没有它的第一页上工作。
  • 知道了!我使用的是request.POST.getlist(admin.ACTION_CHECKBOX_NAME),它只获取页面上选择的 100 个项目。 Queryset 看到做出了“全选”的选择。
  • obj.pk|unlocalize 给出错误:django.template.exceptions.TemplateSyntaxError: Invalid filter: 'unlocalize'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-03
  • 1970-01-01
  • 2016-02-05
  • 1970-01-01
  • 2020-11-26
  • 2018-11-26
  • 1970-01-01
相关资源
最近更新 更多