0

我更改了管理视图,如下所述: 如何显示外键子项的 Django 管理更改列表视图?

我有客户->项目->操作我通过这种方法获得项目的所有操作:

def related_actions(self, obj):
    from django.core import urlresolvers
    url = urlresolvers.reverse("admin:workflow_action_changelist")
    lookup = u"project__exact"
    text = obj.name
    return u"<a href='%s?%s=%d'>%s</a>" % (url, lookup, obj.pk, text)

现在我想自定义 change_list 中的 addlink。管理员 change_list 被 /workflow/templates/admin/workflow/action/change_list.html 中的模板覆盖,但所有三个模型都使用相同的模板。所以我认为必须有一个更好的解决方案作为模板中的 harcode param 当我换行时

<a href="add/{% if is_popup %}?_popup=1{% endif %}" class="addlink">

<a href="add/?actionstatus=5" class="addlink">

在新的操作表单中预先选择了操作类别。但是我怎么能覆盖每个模型中的 addlink。

我必须通过项目视图中的参数获取操作状态:

/workflow/action/?project__exact=5

有什么建议么?

是否有类似这种伪用于动作模型的东西?

 def add(self)
     get param projectid from url 
     return "<a href='/workflow/action/add/%s' target='_blank'>Add Action</a>" % (parent.project id)
4

1 回答 1

2

AFAIK,没有这样add的。
您可以通过扩展自定义change_list.html,尤其是它的object-list-item块:

{% block object-tools-items %}
  <li>
    <a href="{% url cl.opts|admin_urlname:'add' %}{% if is_popup %}?_popup=1{% else %}?{% endif %}{% if "project" in cl.params %}&amp;project={{ cl.params.project }}{% endif %}" class="addlink">
      {% blocktrans with cl.opts.verbose_name as name %}Add {{ name }}{% endblocktrans %}
    </a>
  </li> 
{% endblock %}

这里,clChangeList实例。cl.params被过滤request.GET。该代码检查查询字符串中是否存在project并将其值附加到生成的 addlink。

当更改列表页面完成加载时,您还可以编写 JS 代码来更新添加链接。就像是

(function($){
$(function(){
var m = window.location.search.match(/[?&]project=([^&]*)/);
if (m){
    var link = $('a.addlink').attr('href');
    $('a.addlink').attr('href', link+(link.match(/\?_popup=1$/)?'&':'?')+'project='+m[1]);
}
});
})(django.jQuery);

检查以进行一般参数操作。

于 2012-05-09T13:56:35.623 回答