Django管理后台同时使用Django Reversion和Django-Import-Export

11 投票
4 回答
1753 浏览
提问于 2025-04-18 17:59

我正在尝试让Django Reversion和Django-Import-Export同时在同一个模型上工作……我不确定我的想法是否正确,或者我是否应该使用多个admin.py文件等等。

我试过以下方法,但这只让Django Reversion能工作。如果我把它们换个顺序,导入导出就能工作。如果能同时启用这两个功能,那就太好了。

class MyModelAdmin(reversion.VersionAdmin, ImportExportModelAdmin):
    pass

我查看了这两个项目的文档,但还是搞不清楚。

http://django-reversion.readthedocs.org/en/latest/admin.html#admin https://django-import-export.readthedocs.org/en/latest/getting_started.html

谢谢,

xc0m

4 个回答

0

不确定这个问题现在是否还适用,但这里有一个简单的解决办法:

{% extends "admin/change_list.html" %}
{% load i18n admin_urls %}

{% block object-tools-items %}
    {% if not is_popup and has_add_permission and has_change_permission %}
        <li><a href="{% url opts|admin_urlname:'recoverlist' %}" class="recoverlink">{% blocktrans with cl.opts.verbose_name_plural|escape as name %}Recover deleted {{name}}{% endblocktrans %}</a></li>
    {% endif %}
    {{ block.super }}
{% endblock %}

class CampaignAdmin(ImportExportModelAdmin, VersionAdmin):
  pass

1

我没有用Reversion做过这个,但我觉得你应该使用ImportExportMixin:

from import_export.admin import ImportExportMixin

class MyModelAdmin(ImportExportMixin, reversion.VersionAdmin):
    pass

我就是这样在另一个子类中使用它的,效果很好。

4

最终结果:

导入导出恢复已删除链接

受到@Aidan Doherty的回答的启发,我创建了一个新的类,这个类结合了VersionAdminImportMixinExportMixin这些子类,并扩展了一个自定义的change_list_template

它的样子是这样的:

ImportExportVersionModelAdmin.py

from import_export.admin import ImportMixin, ExportMixin
from reversion.admin import VersionAdmin


class ImportExportVersionModelAdmin(ImportMixin, ExportMixin, VersionAdmin):
    """
    Import, export and Version admin.
    Fixes missing link in change_list admin view :)
    """
    #: template for change_list view
    change_list_template = 'change_list_import_export_version.html'

templates/change_list_import_export_version.html

{% extends "admin/import_export/change_list.html" %}
{% load i18n admin_urls %}

{% block object-tools-items %}
    <li><a href="import/" class="import_link">{% trans "Import" %}</a></li>
    <li><a href="export/{{ cl.get_query_string }}" class="export_link">{% trans "Export" %}</a></li>
    {% if not is_popup and has_add_permission and has_change_permission %}
        <li><a href="{% url opts|admin_urlname:'recoverlist' %}" class="recoverlink">{% blocktrans with cl.opts.verbose_name_plural|escape as name %}Recover deleted {{name}}{% endblocktrans %}</a></li>
    {% endif %}
    {{ block.super }}
{% endblock %}

这样我就可以像这样使用它:

class SiteAdmin(ImportExportVersionModelAdmin):
    pass


admin.site.register(Site, SiteAdmin)

这个灵感直接来源于import_export的admin.py中的ImportExportMixin它的change_list_import_export.html模板,再加上reversion的模板

注意:你可以将这个解决方案应用到多个子类上哦 :)

4

我遇到了同样的问题,我通过扩展Django管理后台的更改列表模板来解决这个问题,并通过下面的例子添加了链接。

***change_list.html****    
{% extends "admin/change_list.html" %}

{% load i18n %} 

{% block object-tools %}
  {% if has_add_permission %}
    <ul class="object-tools ">
      {% block object-tools-items %}
        {% if not is_popup %}
          <li><a href="import/" class="import_link">{% trans "Import" %}</a></li>
          <li><a href="export/{{ cl.get_query_string }}" class="export_link">{% trans "Export" %}</a></li>
          <li><a href="{{recoverlist_url}}" class="recoverlink">{% blocktrans with cl.opts.verbose_name_plural|escape as name %}Recover deleted {{name}}{% endblocktrans %}</a></li>
        {% endif %}
       <li><a href="add/{% if is_popup %}?_popup=1{% endif %}" class="addlink">{% blocktrans with cl.opts.verbose_name as name %}Add {{ name }}{% endblocktrans %}</a></li>
     {% endblock %}
   </ul>
 {% endif %}
{% endblock %}


***admin.py***
class MyAdmin(ImportExportMixin, MyModelAdmin):
    change_list_template = "change_list.html"
    resource_class = MyResource

撰写回答