繁体   English   中英

创建一个仅显示(不可编辑)Django 管理字段

[英]Creating a display-only (non-editable) Django admin field

是否可以构建一个自定义的 model 字段/小部件组合,它显示一个值但从不将任何内容写回数据库? 我会专门在管理员的 forms 中使用这个小部件。

我写了我自己的字段,它覆盖了formfield()方法来声明它自己的小部件 class。它显示得很好,但是一旦在管理中单击“保存”按钮,我就会收到验证错误:

This field is required.

这是有道理的,考虑到我的小部件没有呈现表单域。 然而,我想做的基本上是从更新过程中删除这个字段:无论何时在管理员中使用,它根本不应该在 SQL 更新中提及。

那可能吗?

这是我到目前为止的代码草图:

class MyWidget(Widget):
    def render(self, name, value, attrs=None):
        if value is None:
            value = ""
        else:
            # pretty print the contents of value here
            return '<table>' + ''.join(rows) + '</table>'

class MyField(JSONField):
    def __init__(self, *args, **kwargs):
        kwargs['null'] = False
        kwargs['default'] = list
        super(MyField, self).__init__(*args, **kwargs)

    def formfield(self, **kwargs):
        defaults = {
            'form_class': JSONFormField,
            'widget': MyWidget,
        }
        defaults.update(**kwargs)
        return super(MyField, self).formfield(**defaults)

更新 1:用例是该字段表示审计日志。 在内部,它将定期写入。 然而,管理员永远不需要写它,它只需要以一种非常可读的格式呈现出来。

我没有在应用程序中使用任何其他 ModelForms,因此管理员是唯一的表单用户。 我不想在管理类本身上实现该行为,因为该字段将在各种模型中重复使用,并且应该始终以相同的方式运行。

有多种方法可以在管理页面中创建只读字段。 您对数据库存储的要求有点模糊,所以我会查看选项。

您必须先在admin.py注册AdminModel:

from django.contrib import admin
from yourapp.models import YourModel

class YourAdmin(admin.ModelAdmin):
    pass

admin.site.register(YourModel, YourAdmin)

现在您可以添加不同的行为。 例如,您可以添加编辑/添加页面中显示的字段列表:

class YourAdmin(admin.ModelAdmin):
    fields = ['field1', 'field2']

这可以是模型字段,模型属性或模型方法的名称。 方法以只读方式显示。

如果你想让一个字段只读,请明确添加:

class YourAdmin(admin.ModelAdmin):
    fields = ['field1', 'field2']
    readonly_fields = ['field2']

然后,您可以选择通过添加具有相同名称的方法来完全覆盖字段的显示。 您甚至不需要具有该名称的模型字段/方法,然后:

class YourAdmin(admin.ModelAdmin):
    fields = ['field1', 'field2']
    readonly_fields = ['field2']

    def field2(self, obj):
        return '*** CLASSIFIED *** {}'.format(obj.field2)

使用django.utils.safestring.mark_safe您也可以返回HTML代码。

管理员的所有其他选项均可用,但窗口小部件配置除外,因为它仅适用于可写字段。

我可能会对你想要的东西感到困惑,但你可能想看一下模型属性。 这是我当前项目的一个例子。

模型中的代码:

class Textbook(models.Model):
    #other fields

    @property
    def NumWishes(self):
        return self.wishlist_set.count()

然后你可以在管理页面上显示它。

class Textbook_table(admin.ModelAdmin):
    fields = ["""attributes that are saved in the model"""]
    list_display = ("""attributes that are saved in the model""", 'NumWishes'')

所以现在我可以在管理页面中显示NumWishes,但不需要使用模型创建。

你好class管理员修改权限方法

@admin.register(my_model)
class My_modelAdmin(admin.ModelAdmin):


    def has_delete_permission(self, request, obj=None):
        return False

    def has_change_permission(self, request, obj=None):
        return False

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM