Django管理界面:如何同时使用Django Reversion和Django-Import-Export?

11

我正在尝试在同一模型上启用Django版本控制和Django导入导出......不确定我的逻辑是否正确或者是否应该使用多个admin.py文件等

我已经尝试了以下方法,但这只允许Django版本控制工作,如果我将它们互换则导入导出可以正常工作。如果两者都能同时启用那就太好了。

class MyModelAdmin(reversion.VersionAdmin, ImportExportModelAdmin):
    pass

我查看了两个项目的readthedocs文档,但仍感到困惑。

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

谢谢 xc0m

4个回答

4

我遇到了同样的问题,通过扩展Django admin change_list模板并通过以下示例添加链接来修复它。

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

1
我只想补充一下,如果使用 Django Grappelli,这种方法特别有效,您只需将 <ul class="object-tools"> 更改为 <ul class="grp-object-tools">,它会保持整洁!希望这能帮助到未来的某个人! - Kinetic Stack
我创建了一个新的子类, 添加了类似的 change_list_template = "change_list.html", 这样我就没有使我的所有模型变得臃肿。 - GabLeRoux

4

最终结果:

import export recover deleted links

@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的模板
注意:您可以将此解决方案应用于多个子类 :)

1

我没有使用过Reversion来完成这个操作,但是我认为你需要使用ImportExportMixin:

from import_export.admin import ImportExportMixin

class MyModelAdmin(ImportExportMixin, reversion.VersionAdmin):
    pass

我正在使用它与另一个子类一起,并且效果非常好。


ImportExportMixinImportExportModelAdmin都是正确的。只有一个小问题:使用这种方式,在管理界面的change_list视图中无法生成URL。它只会生成第一个子类的链接。(首先使用ImportExport将提供importexport链接,但会隐藏恢复已删除的“model”。好消息是这只是一个模板问题。在change_list URL后添加/recover,您将进入正确的视图。编辑模型视图将显示显示历史记录链接。 - GabLeRoux

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接