Django-admin list_editable enable/disable 即时(edit/view 模式检查)
Django-admin list_editable enable/disable on the fly (edit/view mode check)
我想通过按钮(或类似按钮)更改页面的 edit/view 模式。
编辑模式等于 EntityModelAdmin 正文中指定的 list_editable。
查看模式等于空 list_editable.
@admin.register(models.EntityModel)
class EntityModelAdmin(admin.ModelAdmin):
list_display = ('name', 'barcode', 'short_code', )
list_editable = ('barcode', 'short_code', )
如何实现?似乎我应该覆盖一些 class/function 来考虑模式触发器的状态。
对实体实例的 add/change 页也做同样的事情(所有字段都是只读的)也很好。
为 EntityModel
创建 proxy 模型:
class ProxyEntityModel(EntityModel):
class Meta:
proxy = True
然后是单独的 ModelAdmin
:
class ProxyEntityModelAdmin(admin.ModelAdmin):
list_display = ('name', 'barcode', )
list_editable = ('barcode', )
对于我来说,最好覆盖 admin.ModelAdmin
的 changelist_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)
可能不是 "true way",但所有这些都有效。
Also it will be good to do the same (all fields is read-only) with
add/change page of Entity instance.
django admin: separate read-only view and change view
我想通过按钮(或类似按钮)更改页面的 edit/view 模式。 编辑模式等于 EntityModelAdmin 正文中指定的 list_editable。 查看模式等于空 list_editable.
@admin.register(models.EntityModel)
class EntityModelAdmin(admin.ModelAdmin):
list_display = ('name', 'barcode', 'short_code', )
list_editable = ('barcode', 'short_code', )
如何实现?似乎我应该覆盖一些 class/function 来考虑模式触发器的状态。
对实体实例的 add/change 页也做同样的事情(所有字段都是只读的)也很好。
为 EntityModel
创建 proxy 模型:
class ProxyEntityModel(EntityModel):
class Meta:
proxy = True
然后是单独的 ModelAdmin
:
class ProxyEntityModelAdmin(admin.ModelAdmin):
list_display = ('name', 'barcode', )
list_editable = ('barcode', )
对于我来说,最好覆盖 admin.ModelAdmin
的 changelist_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)
可能不是 "true way",但所有这些都有效。
Also it will be good to do the same (all fields is read-only) with add/change page of Entity instance.
django admin: separate read-only view and change view