确认后未执行 Django 管理操作

Posted

技术标签:

【中文标题】确认后未执行 Django 管理操作【英文标题】:Django admin action not executed after confirming 【发布时间】:2013-01-03 23:34:16 【问题描述】:

在我的 Django 应用程序中,我想实现一个中间页面,该页面要求在执行特定管理操作之前进行确认。我以this post 为例。

我使用现有的delete_confirmation.html 模板作为出发点,并使其部分工作。显示确认页面并显示所选对象。但是,在单击“是的,我确定”后,我的管理操作永远不会被调用。

在我的 admin.py 中有:

def cancel_selected_bookings(self, request, queryset):
    """
    Cancel selected bookings.
    """
    if request.POST.get("post"):
        for booking in queryset:
            booking.cancel()
            message = "Booking %s successfully cancelled." % booking.booking_id
            messages.info(request, message)
    else:
        context = 
            "objects_name": "bookings",
            'title': "Confirm cancellation of selected bookings:",
            'cancellable_bookings': [queryset],
            'action_checkbox_name': helpers.ACTION_CHECKBOX_NAME,
        
        return TemplateResponse(request, 'admin/bookings/confirm_cancel.html', context, current_app=self.admin_site.name)

在我的模板中(完整模板的剪辑):

        <div class="grp-group">
            <h2>
                % blocktrans %
                    Are you sure you want to cancel the selected  objects_name ?
                % endblocktrans %
            </h2>
            % for cancellable_booking in cancellable_bookings %
                <ul class="grp-nested-list"> cancellable_booking|unordered_list </ul>
            % endfor %
        </div>
        <form action="" method="post">% csrf_token %
            <div id="submit" class="grp-module grp-submit-row grp-fixed-footer">
                % for obj in queryset %
                    <input type="hidden" name=" action_checkbox_name " value=" obj.pk|unlocalize " />
                % endfor %
                <input type="hidden" name="action" value="cancel_selected_bookings" />
                <input type="hidden" name="post" value="yes" />
                <ul>
                    <li class="grp-float-left"><a href="." class="grp-button grp-cancel-link">% trans "Cancel" %</a></li>
                    <li><input type="submit" value="% trans "Yes, I'm sure" %" class="grp-button grp-default" /></li>
                </ul>
                <input type="hidden" name="post" value="yes" />
            </div>
        </form>

编辑:

我在上面的模板中发现了一个问题。行:

% for obj in queryset %
  <input type="hidden" name=" action_checkbox_name " value=" obj.pk|unlocalize " />
% endfor %

需要替换为:

% for cancellable_booking in cancellable_bookings %
  <input type="hidden" name=" action_checkbox_name " value=" cancellable_booking.id " />
% endfor %

然而,出于某种神秘的原因,cancellable_booking.id 并未设置隐藏字段的值。当我用现有的 id 对其进行硬编码时,一切都按预期工作。我做错了什么??

【问题讨论】:

【参考方案1】:

这将起作用:

在动作方法中:

context = 
    'objects_name': 'bookings',
    'title': 'Confirm cancellation of selected bookings:',
    'cancellable_bookings': [queryset],
    'ids': queryset.values_list("id"),
    'action_checkbox_name': helpers.ACTION_CHECKBOX_NAME,

在模板中:

% for id in ids %
    <input type="hidden" name=" action_checkbox_name " value=" id.0|unlocalize " />
% endfor %

不知道为什么迭代 queryset 不起作用,但是唉......

【讨论】:

以上是关于确认后未执行 Django 管理操作的主要内容,如果未能解决你的问题,请参考以下文章

保存确认页面在哪里可以挂接到 Django 管理员? (类似于删除确认)

django中数据库事物的管理

Session问题-一个部门A登录后未注销另一个部门B再登录,以B的身份操作A的成员

django功能七

django功能七

您可以将参数添加到 Django 自定义管理操作吗?