如何通过 django admin 中的操作请求用户输入?

use*_*832 5 django django-models django-admin-filters

在我的代码中,我正在编写一个用于分组的操作,我想询问用户他们希望每个组有多少人,然后用一个警告框进行响应,根据用户输入,您有 4 个组. 我如何在 django admin 中执行此操作,我如何创建某种弹出窗口,询问他们想要加入一个组的人数?(我试图通过一个动作来实现这一点)

管理.py:

 Def howmany (modeladmin, request, queryset):
      people = queryset.count()
      amount_per = [the number that the user inputs]
      Amount_of_groups = people/amount_per
Run Code Online (Sandbox Code Playgroud)

ARK*_*han 13

我在这里找到了一种更简化、更好的方法:

您只需要创建一个像这样的操作表单。

from django.contrib.admin.helpers import ActionForm
from django import forms


class XForm(ActionForm):
    x_field = forms.ModelChoiceField(queryset=Status.objects.all(), required=False)
Run Code Online (Sandbox Code Playgroud)

现在,在 admin.py 中定义该 XForm

class ConsignmentAdmin(admin.ModelAdmin):

    action_form = XForm
    actions = ['change_status']

    def change_status(modeladmin, request, queryset):
        print(request.POST['x_field'])
        for obj in queryset:
            print(obj)
    change_status.short_description = "Change status according to the field"
Run Code Online (Sandbox Code Playgroud)


mrv*_*vol 6

admin.py 类似:

Class MyAdmin(admin.ModelAdmin):

    def howmany (modeladmin, request, queryset):
        people = queryset.count()
        amount_per = [the number that the user inputs]
        Amount_of_groups = people/amount_per

        if 'apply' in request.POST:
            form = AmountPerForm(request.POST)

            if form.is_valid():
                amount_per = form.cleaned_data['amount_per']
                self.message_user(request, u'You selected - %s' % amount_per)
            return HttpResponseRedirect(request.get_full_path())
        else:
            form = AmountPerForm()

        return render(request, 'admin/amount_per_form.html', {
            'items': queryset.order_by('pk'),
            'form': form,
            'title': u'Your title'
            })
Run Code Online (Sandbox Code Playgroud)

文件“admin/amount_per_form.html”包含如下内容:

 {% extends 'admin/base_site.html' %}

 {% block content %}
 <form action="" method="post">
    {% csrf_token %}
    <input type="hidden" name="action" value="assign_new_manager" />
    {{ form }}
    <p>Apply for:</p>
    <ul>{{ items|unordered_list }}</ul>
    <input type="submit" name="apply" value="Apply" />
 </form>
 {% endblock %}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,在表单中迭代项目列表时,您需要包含隐藏的 _selected_action 字段。如果没有它,当您提交时,您将不会被带到您的操作,只会返回到管理列表,并且您的操作将不会成功(使用 Django 版本 2.2)。示例:&lt;input type="hidden" name="_selected_action" value="{{ item.pk }}"/&gt; ....我只是使用这个解决方案浪费了一个小时 (3认同)