具有中间页面的Django管理员操作:未获取信息

时间:2018-10-16 23:35:10

标签: python django action

我正在尝试创建一个将特定时间增量添加到某个日期的管理操作。时间增量将从中间页面的输入中读取。确认之后,我会将那个增量应用于先前选择的每个实例。使用此代码(我对此问题进行了简化),无法获得输入时间增量的值。我无法确定用户是否按下了“应用”按钮。

models.py

class Match(models.Model):
    date_of_match=models.DateTimeField()

admin.py

class MatchAdmin(admin.ModelAdmin):
    actions=('move_date',)
def move_date(self,request,queryset):
    if 'apply' in request.POST:
        #to do, add timedelta to date_of_match
        print("I'M IN!")
    return render(request.'admin/move_date.html',{'matches':queryset})
move_date.short_description="Move date"

move_date.html

{% extends "admin/base_site.html" %}
{% block content %}
<form action="" method="post">{% csrf_token %}
    <p>How much delta?<p>
    <input type="number" step="1" value="days"/>
    <input type="hidden" name="action" value="move_date" />
    <input type="submit" name="apply" value="Apply"/>
</form>
{% endblock %}

1 个答案:

答案 0 :(得分:0)

为OP提供帮助可能为时已晚,但是当我遇到相同的问题时遇到了这个问题,并且在其他地方查看发生了什么并不立即可见。

处理changelist_view(我们正在POST进入的视图)后,它将在request.POST中查找特定的密钥:_selected_action,该密钥在{{1 }}设为django.contrib.admin.helpers。我使用了内置在admin中的delete操作作为参考,它在模板中以这种方式使用它:

ACTION_CHECKBOX_NAME

然后在您的上下文中,您只需要:

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

现在,当您context = { 'queryset': queryset, # method param 'action_checkbox_name': helpers.ACTION_CHECKBOX_NAME, } 表单时,将再次调用您的方法,并且您可以在此处尝试检测/处理POST。 (您想从处理POST数据的块中返回None,以便该视图知道返回列表视图。)