【问题标题】:Django-admin list_editable enable/disable on the fly (edit/view mode check)Django-admin list_editable 动态启用/禁用(编辑/查看模式检查)
【发布时间】:2015-05-12 10:13:52
【问题描述】:

我想通过按钮(或类似按钮)更改页面的编辑/查看模式。 编辑模式等于 EntityModelAdmin 正文中指定的 list_editable。 查看模式等于空list_editable。

@admin.register(models.EntityModel)
class EntityModelAdmin(admin.ModelAdmin):
    list_display = ('name', 'barcode', 'short_code', )
    list_editable = ('barcode', 'short_code', )

如何做到这一点?似乎我应该重写一些类/函数来考虑模式触发器的状态。

此外,最好对实体实例的添加/更改页面执行相同操作(所有字段都是只读的)。

【问题讨论】:

    标签: django django-admin django-modeladmin


    【解决方案1】:

    EntityModel 创建proxy 模型:

    class ProxyEntityModel(EntityModel):
        class Meta:
            proxy = True
    

    然后是单独的ModelAdmin

    class ProxyEntityModelAdmin(admin.ModelAdmin):
        list_display = ('name', 'barcode', )
        list_editable = ('barcode', )
    

    【讨论】:

    • 好的,如何使用类似按钮在它们之间切换?
    • 我认为我的问题仅与视觉表示有关,因此最好在管理员级别而不是模型上执行此操作。您对我建议的解决方案有何看法?
    【解决方案2】:

    对我来说最好覆盖admin.ModelAdminchangelist_view方法:

    class EntityModelAdmin(admin.ModelAdmin):
        list_display = ('name', 'barcode', 'short_code', )
        list_editable = ('barcode', 'short_code', )
    
        @csrf_protect_m
        def changelist_view(self, request, extra_context=None):
            """
            The 'change list' admin view for this model.
            Overrided only for add support of edit/view mode switcher.
            """
            ...parent code...
            try:
                cl = ChangeList(request, ...parent code...)
    
                # Customization for view/edit mode support
                if 'edit_mode' not in request.COOKIES:
                    cl.list_editable = ()
            ...parent code...
    

    可能最好覆盖另一种方法。不确定是否可以只覆盖相当大的changelist_view 方法的一部分而不按原样复制大部分代码(...父代码...)。

    按钮切换器可以是这样的:

    {% load myapp_various_tags %}  {# load get_item tag for dictionary #}
    
        <div id="mode">
            <div class="mode_item edit_mode {% if request.COOKIES|get_item:'edit_mode' %}selected{% endif %}" onclick="$.cookie('edit_mode', '1', { path: '/', expires: 30 }); location.reload(true);">
                <div class="header_icon"></div>
                <div class="header_text">{% trans "edit" %}</div>
            </div>
            <div class="mode_item view_mode {% if not request.COOKIES|get_item:'edit_mode' %}selected{% endif %}" onclick="$.cookie('edit_mode', null, { path: '/', expires: -1 }); location.reload(true);">
                <div class="header_icon"></div>
                <div class="header_text">{% trans "view" %}</div>
            </div>
        </div>
    

    myapp_various_tags.py 在哪里:

    from django.template.defaulttags import register
    @register.filter
    def get_item(dictionary, key):
        return dictionary.get(key)
    

    可能这不是“真正的方式”,但所有这些都是可行的。

    也可以这样做(所有字段都是只读的) 添加/更改实体实例的页面。

    django admin: separate read-only view and change view

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-27
      • 1970-01-01
      • 1970-01-01
      • 2012-03-19
      • 1970-01-01
      • 1970-01-01
      • 2021-09-10
      相关资源
      最近更新 更多