1

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

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

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

对实体实例的添加/更改页面做同样的事情(所有字段都是只读的)也会很好。

4

2 回答 2

1

至于我,最好覆盖以下changelist_view方法admin.ModelAdmin

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:单独的只读视图和更改视图

于 2015-03-15T17:38:14.540 回答
0

为:创建代理模型EntityModel

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

然后是分开ModelAdmin的:

class ProxyEntityModelAdmin(admin.ModelAdmin):
    list_display = ('name', 'barcode', )
    list_editable = ('barcode', )
于 2015-03-10T22:10:47.837 回答