根据通过querystring传递的条件,在Admin changelist中自定义addlink

时间:2012-05-09 12:48:23

标签: django django-admin django-templates

我改变了管理视图,如下所述: How Do I Show Django Admin Change List View of foreign key children?

我有客户 - >项目 - >行动 我通过这种方法得到了项目的所有动作:

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">

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

我必须通过项目视图中的参数获取actionstatus:

/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)

1 个答案:

答案 0 :(得分: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);

检查this是否有一般参数操作。