整个模型为只读。

7 浏览
0 Comments

整个模型为只读。

在Django管理界面中,有没有一种方法可以使模型只读?我指的是整个模型,所以无法添加、删除或修改,只能查看对象和字段,全部都是只读的。

0
0 Comments

在Django 1.11版本中,由于“查看权限”未能被添加,因此无法实现将ModelAdmin设置为只读。以下是一种解决方案,通过使保存模型更改和添加模型历史记录条目变为无操作来实现将ModelAdmin设置为只读。

def false(*args, **kwargs):
    """A simple no-op function to make our changes below readable."""
    return False
class MyModelReadOnlyAdmin(admin.ModelAdmin):
    list_display = [
        # list your admin listview entries here (as usual) 
    ]
    readonly_fields = [
        # list your read-only fields here (as usual)
    ]
    actions = None
    has_add_permission = false
    has_delete_permission = false
    log_change = false
    message_user = false
    save_model = false

注意:不要将false的无操作函数与False内置函数混淆。如果不喜欢在类外部使用辅助函数,可以将其放入类内部,将其命名为no_op或其他名称,或者通过常规的def来重写受影响的属性。这样不够DRY(Don't Repeat Yourself),但如果你不在意的话...

这将:

1. 删除列表视图中的操作下拉框(包括“删除”选项)

2. 禁止添加新的模型条目

3. 禁止删除现有的模型条目

4. 避免在模型历史记录中创建日志条目

5. 在保存后避免显示“成功更改”消息

6. 避免将更改保存到数据库中

这将不会:

- 删除或替换“保存并继续编辑”和“保存”两个按钮(这会改善用户体验)

请注意,Django 1.10版本中已经删除了get_all_field_names(如答案中提到的)。经过Django 1.10.5版本测试。

0
0 Comments

问题的出现原因是在ModelAdmin中,需要将某些字段设置为只读,但是没有提供直接的方法来实现这一功能。解决方法是通过重写get_readonly_fields()方法来确定只读字段,然后将这个方法应用到ReadOnlyAdmin中,从而实现只读的Admin界面。

代码中的get_readonly_fields()方法首先检查是否有声明的fieldsets,如果有,则通过flatten_fieldsets()函数将其展平。如果没有声明的fieldsets,则通过get_formset()方法获取表单,然后通过base_fields.keys()获取所有字段的名称。最后,返回所有的字段名称。

另外,为了隐藏添加和删除按钮,还需要重写has_add_permission()和has_delete_permission()方法并返回False。

同时,还提到了一个关于设置所有字段为只读的方法,即使用MyModel._meta.get_all_field_names()来获取所有字段的名称。另外还给出了另一种实现方式,即通过检查是否有声明的fieldsets来确定只读字段。

最后,还提到了一个关于Django版本兼容性的问题,即在Django 1.11版本中,会出现AttributeError: 'ReadOnlyAdmin' object has no attribute 'declared_fieldsets'的错误。并且在Django 1.10版本中,_meta.get_all_field_names()方法已被移除。

总结起来,解决这个问题的方法是通过重写get_readonly_fields()方法来确定只读字段,并通过重写has_add_permission()和has_delete_permission()方法来隐藏添加和删除按钮。另外,还给出了一些关于设置所有字段为只读的方法,并提到了Django版本兼容性的问题。

0
0 Comments

问题:

在Django 1.11中,选定的答案不起作用,我找到了一种更简单的方法来解决这个问题,所以我想分享一下:

class MyModelAdmin(admin.ModelAdmin):
    def get_readonly_fields(self, request, obj=None):
        return [f.name for f in obj._meta.fields]
    def has_delete_permission(self, request, obj=None):
        return False
    def has_add_permission(self, request):
        return False

原因:

问题的原因是在Django 1.11中,选定的答案不起作用。可能是由于Django版本的变化,导致选定的答案无法正确实现模型的只读属性。

解决方法:

根据我的发现,有一种更简单的方法可以解决这个问题。通过创建一个自定义的ModelAdmin类,并重写其中的几个方法,可以实现整个模型作为只读的效果。

首先,我们需要创建一个名为MyModelAdmin的自定义ModelAdmin类。然后,我们需要重写其中的三个方法:get_readonly_fields,has_delete_permission和has_add_permission。

在get_readonly_fields方法中,我们通过使用obj._meta.fields来获取模型的所有字段,并将其返回为只读字段。这样,所有的字段都将变为只读状态。

在has_delete_permission方法中,我们返回False,以阻止删除操作。

在has_add_permission方法中,我们返回False,以阻止添加操作。

通过这种方式,我们可以确保整个模型在管理员界面中以只读的方式呈现,用户将无法进行编辑、删除或添加操作。

这是一个更简单的解决方案,可以有效地解决在Django 1.11中实现整个模型为只读的问题。

0