Django Admin Action Confirmation页面

mog*_*goh 6 django django-admin

在我的Django项目中,我有一个需要确认页面的管理操作.我将它定位在delete_selected操作上,但它不起作用.这就是我所拥有的.

我的admin.py的一部分

def my_action(modeladmin, request, queryset):
    if request.POST.get('post'):
        print "Performing action"
        # action code here
        return None
    else:
        return TemplateResponse(request, "admin/my_action_confirmation.html")
Run Code Online (Sandbox Code Playgroud)

管理员/ my_action_confirmation.html

<form action="" method="post">{% csrf_token %}
    <div>
        <input type="hidden" name="post" value="yes" />
        <input type="hidden" name="action" value="my_action" />
        <input type="submit" value="Confirm" />
    </div>
</form>
Run Code Online (Sandbox Code Playgroud)

这几乎起作用.我进入确认页面,但是如果我点击"确认",我就会回到原始页面.永远不会到达带有操作代码的部分.实际上,my_action函数不是第二次调用.那么我怎么告诉django,一旦我点击确认,我的第二次调用my_action函数?

Azi*_*tov 7

管理员.py

def require_confirmation(func):
    def wrapper(modeladmin, request, queryset):
        if request.POST.get("confirmation") is None:
            request.current_app = modeladmin.admin_site.name
            context = {"action": request.POST["action"], "queryset": queryset}
            return TemplateResponse(request, "admin/action_confirmation.html", context)

        return func(modeladmin, request, queryset)

    wrapper.__name__ = func.__name__
    return wrapper

@require_confirmation
def do_dangerous_action(modeladmin, request, queryset):
    return 42/0

Run Code Online (Sandbox Code Playgroud)

管理/action_confirmation.html

{% extends "admin/base_site.html" %}
{% load i18n l10n admin_urls %}

{% block bodyclass %}{{ block.super }} app-{{ opts.app_label }} model-{{ opts.model_name }} delete-confirmation
  delete-selected-confirmation{% endblock %}

{% block content %}
  <p>Are you sure you want to {{ action }}?</p>
  <ul style="padding: 0">
    {% for object in queryset.all %}
      <li style="list-style: none; float: left; margin: 5px">
        {{ object }}
      </li>
    {% endfor %}
  </ul>
  <hr>
  <br>
  <form action="" method="post">{% csrf_token %}
    <fieldset class="module aligned">
      {% for obj in queryset.all %}
        <input type="hidden" name="_selected_action" value="{{ obj.pk|unlocalize }}"/>
      {% endfor %}
    </fieldset>
    <div class="submit-row">
      <input type="hidden" name="action" value="{{ action }}"/>
      <input type="submit" name="confirmation" value="Confirm"/>
      <a href="#" onclick="window.history.back(); return false;"
         class="button cancel-link">{% trans "No, take me back" %}</a>
    </div>
  </form>
{% endblock %}
Run Code Online (Sandbox Code Playgroud)


mog*_*goh 6

编辑:我更想念然后

更正后的my_action

def my_action(modeladmin, request, queryset):
    if request.POST.get('post'):
        print "Performing action"
        # action code here
        return None
    else:
        request.current_app = modeladmin.admin_site.name
        return TemplateResponse(request, "admin/my_action_confirmation.html")
Run Code Online (Sandbox Code Playgroud)

admin / my_action_confirmation.html

{% load l10n %}
<form action="" method="post">{% csrf_token %}
    <div>
        {% for obj in queryset %}
        <input type="hidden" name="{{ action_checkbox_name }}" value="{{ obj.pk|unlocalize }}" />
        {% endfor %}
        <input type="hidden" name="post" value="yes" />
        <input type="hidden" name="action" value="my_action" />
        <input type="submit" value="Confirm" />
    </div>
</form>
Run Code Online (Sandbox Code Playgroud)