3

私のDjangoアプリでは、特定の管理アクションを実行する前に確認を求める中間ページを実装したいと思います。この投稿を例として取り上げました。

既存の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>

編集:

上記のテンプレートで1つの問題が見つかりました。台詞:

{% 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を使用してハードコーディングすると、すべて期待どおりに機能します。私は何が間違っているのですか?

4

1 に答える 1

2

これは機能します:

アクションメソッドの場合:

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ませんが、残念ながら...

于 2013-01-21T15:50:33.960 に答える