我已经为我的模型定义了一个自定义的管理操作,它可以像预期的那样完美地工作。我还研究了在SO上向管理更改表单页面添加按钮的多种方法。我唯一缺少的步骤是如何在更改表单页面中的按钮执行我的自定义管理操作与当前对象?
目标是允许管理员单独检查每个对象并对它们执行操作,而无需返回列表视图,选择检查的对象并执行列表中的操作。
我的自定义管理操作如下所示:
def admin_apply_change(modeladmin, request, queryset):
# loop over objects in query set and perform action
我假设有一种简单而干净的方法可以在管理员更改表单中调用此操作,其中queryset
将仅包含管理员正在查看的当前打开的对象。
**注意:**如果按钮位于变更表单的底部,靠近Save
按钮,而不是位于顶部,History
不太明显,则会更好。
解决方案:
See the answer below乘以Remi得到解。为了使其工作,需要进行以下更正:
1.在response_change
的覆盖中,一些变量的初始化丢失:
opts = self.model._meta
pk_value = obj._get_pk_val()
preserved_filters = self.get_preserved_filters(request)
1.新的包含标签custom_submit_row
应该放在templatetags中,而不是admin中(请参阅docs for custom templatetags)
1.这是你可能会浪费一些时间的疏忽。在change_form.html
中,您不仅需要更改建议的行:
{% if save_on_top %}{% block submit_buttons_top %}{% submit_row %}{% endblock %}{% endif %}
还有底部submit_row
出现的更重要的一行:
{% block submit_buttons_bottom %}{% submit_row %}{% endblock %}
- 它位于
change_form.html
中javascript块的正上方。*
5条答案
按热度按时间kqqjbcuj1#
您可以查看change_form_template并将其设置为您的自定义模板,然后覆盖
response_change
方法:从
site-packages/django/contrib/admin/templates/change_form.html
复制change_form.html
并编辑第40行到
也检查行:
就在javascript块上面。
然后你可以在你的www.example.com中注册一个新的包含标签admin.py或者将它添加到templatetags中:
您的
custom_submit_line.html
的内容:它有很多代码,但主要是复制/粘贴。希望能帮上忙。
8ljdwjyq2#
大多数人可能会不假思索地这样做,尽管从答案中并不清楚管理员更改表单应该简单地扩展而不是完全覆盖。
custom_change_form.html
4ngedf3f3#
或者,您可以扩展 submit_line.html 文件,添加自定义按钮(在更改页面的顶部和底部)。
您的文件 templates/adminyour_app_name/your_model_name.html 将以以下开头:
2skhul334#
基于Remi的回答,一个更干净的解决方案,用于在
submit_line.html
模板中覆盖submit-row
。在
change_view
中,您可以将custom_buttons_template
添加到上下文中,以便您可以分别在每个模型上自定义自定义按钮。在此之后,我的模板将加载
admin/test.html
并将内容直接插入到Save
按钮之前的提交行中。如果你想把你的按钮放在其他地方,你可以复制完整的submit_line.html
并把custom_buttons_template
放在任何地方。lztngnrs5#
在Django Admin中的
change
页面中,您可以添加运行管理操作的自定义按钮。例如,首先将
submit_line.html
从django/contrib/admin/templates/admin/submit_line.html
复制到templates/admin/
、templates/admin/app1/
或templates/admin/app1/person/
以覆盖它,如下所示。*templates/admin/
、templates/admin/app1/
或templates/admin/app1/person/
中的submit_line.html
分别适用于所有应用程序中的所有管理员、仅app1
中的所有管理员或仅person
仅app1
中的所有管理员,您可以看到原始的submit_line.html:然后,将
{% if custom_button %}<input ...
添加到submit_line.html
,如下所示:然后,在
settings.py
中的TEMPLATES
中设置BASE_DIR / 'templates'
到'DIRS'
,如下所示:并且,
models.py
中有Person
模型,如下所示:并且,在
admin.py
中有Person
admin和uppercase
admin操作,如下所示:因此,如果您使用
uppercase
管理操作,如下所示:然后,您可以将所选人员设置为大写,如下所示:
并且,
change
页面上尚未显示自定义按钮,如下所示:现在,覆盖
Person
admin中的change_view()和response_change(),如下所示。* 您可以看到原始的change_view()和response_change():然后,在
change
页面上显示一个自定义按钮,如下所示,然后如果您单击自定义按钮:然后,您可以使人大写,如下所示:
另外,覆盖
Person
admin中的add_view()和response_add(),如下所示。* 你可以看到原始的add_view()和response_add():然后,
add
页面上会显示一个自定义按钮,如下所示,然后如果您单击自定义按钮:然后,您可以使人大写,如下所示: