jsd*_*ton 33 django django-admin
我认为无论出于何种原因这很容易做到,但我看得更深,似乎没有直接的方法允许用户在实例的"更改"视图上执行自定义管理操作(即,当您只是查看编辑时屏幕显示单个实例,而不是实例列表).
我忽略了一个简单的方法吗?或者是我唯一的选择来覆盖其中一个管理模板(可能还有ModelAdmin.add_view
方法)?
小智 19
这是这个答案的更新和改进.它适用于django 1.6并重定向到你来自的地方.
class ActionInChangeFormMixin(object):
def response_action(self, request, queryset):
"""
Prefer http referer for redirect
"""
response = super(ActionInChangeFormMixin, self).response_action(request,
queryset)
if isinstance(response, HttpResponseRedirect):
response['Location'] = request.META.get('HTTP_REFERER', response.url)
return response
def change_view(self, request, object_id, extra_context=None):
actions = self.get_actions(request)
if actions:
action_form = self.action_form(auto_id=None)
action_form.fields['action'].choices = self.get_action_choices(request)
else:
action_form = None
extra_context=extra_context or {}
extra_context['action_form'] = action_form
return super(ActionInChangeFormMixin, self).change_view(request, object_id, extra_context=extra_context)
class MyModelAdmin(ActionInChangeFormMixin, ModelAdmin):
......
Run Code Online (Sandbox Code Playgroud)
模板:
{% extends "admin/change_form.html" %}
{% load i18n admin_static admin_list admin_urls %}
{% block extrastyle %}
{{ block.super }}
<link rel="stylesheet" type="text/css" href="{% static "admin/css/changelists.css" %}" />
{% endblock %}
{% block object-tools %}
{{ block.super }}
<div id="changelist">
<form action="{% url opts|admin_urlname:'changelist' %}" method="POST">{% csrf_token %}
{% admin_actions %}
<input type="hidden" name="_selected_action" value="{{ object_id }}">
</form>
</div>
{% endblock %}
Run Code Online (Sandbox Code Playgroud)
jsd*_*ton 10
这就是我最终做的事情.
首先,我扩展了ModelAdmin对象的change_view,如下所示:
def change_view(self, request, object_id, extra_context=None):
actions = self.get_actions(request)
if actions:
action_form = self.action_form(auto_id=None)
action_form.fields['action'].choices = self.get_action_choices(request)
else:
action_form = None
changelist_url = urlresolvers.reverse('admin:checkout_order_changelist')
return super(OrderAdmin, self).change_view(request, object_id, extra_context={
'action_form': action_form,
'changelist_url': changelist_url
})
Run Code Online (Sandbox Code Playgroud)
基本上我们只是收集填充更改视图中的操作下拉列表所需的数据.
然后我只是为有问题的模型扩展了change_form.html:
{% extends "admin/change_form.html" %}
{% load i18n adminmedia admin_list %}
{% block extrastyle %}
{{ block.super }}
<link rel="stylesheet" type="text/css" href="{% admin_media_prefix %}css/changelists.css" />
{% endblock %}
{% block object-tools %}
{{ block.super }}
<div id="changelist">
<form action="{{ changelist_url }}" method="POST">{% csrf_token %}
{% admin_actions %}
<input type="hidden" name="_selected_action" value="{{ object_id }}">
</form>
</div>
{% endblock %}
Run Code Online (Sandbox Code Playgroud)
这与在更改列表视图中输出管理操作部分的方式几乎相同.主要区别在于:1)我必须指定要发布到的表单的URL,2)而不是用于指定应更改哪些对象的复选框,通过隐藏表单字段设置值,以及3)我将更改列表视图中的CSS包含在内,并将操作卡在ID为div的div中#changelist
- 这样框就会看起来不错.
这不是一个很好的解决方案,但它可以正常运行,无需额外配置即可添加其他操作.
我所做的是创建自己的 MYAPP/templates/admin/MYMODEL/change_form.html 模板:
{% extends "admin/change_form.html" %}
{% load i18n %}
{% block object-tools %}
{% if change %}{% if not is_popup %}
<ul class="object-tools">
<li><a href="{% url MY_COMMAND_VIEW original.id %}" class="historylink" >MY COMMAND</a></li>
<li><a href="history/" class="historylink">{% trans "History" %}</a></li>
{% if has_absolute_url %}<li><a href="../../../r/{{ content_type_id }}/{{ object_id }}/" class="viewsitelink">{% trans "View on site" %}</a></li>{% endif%}
</ul>
{% endif %}{% endif %}
{% endblock %}
Run Code Online (Sandbox Code Playgroud)
所以我基本上只更改了历史链接和“现场查看”链接所在的“对象工具”块。原始的change_form.html 的其余部分保持不变。顺便说一句:“original.id”是您正在编辑的模型的 ID。
归档时间: |
|
查看次数: |
9839 次 |
最近记录: |