Hen*_*ger 3 python django django-admin
是否可以构建一个自定义模型字段/窗口小部件组合,它显示一个值但从不将任何内容写回数据库?我会在管理员表单中专门使用这个小部件.
我编写了自己的字段,它覆盖了formfield()声明自己的widget类的方法.它显示得很好,但只要在管理员中单击"保存"按钮,我就会收到验证错误:
This field is required.
Run Code Online (Sandbox Code Playgroud)
考虑到我的小部件没有渲染出表单字段,这是有道理的.但是,我想要做的基本上是从更新过程中删除此字段:无论何时在管理员中使用,都不应该在SQL UPDATE中提及它.
那可能吗?
这是我到目前为止的代码草图:
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)
Run Code Online (Sandbox Code Playgroud)
更新1:用例是该字段表示审核日志.在内部,它将定期写入.然而,管理员永远不需要写它,它只需要以一种非常易读的格式呈现它.
我没有在应用程序中使用任何其他ModelForms,因此admin是唯一的表单用户.我不想在管理类本身上实现这种行为,因为这个字段将在各种模型中重用,并且总是应该以相同的方式运行.
有多种方法可以在管理页面中创建只读字段.您对数据库存储的要求有点模糊,所以我会查看选项.
您必须先注册AdminModel admin.py:
from django.contrib import admin
from yourapp.models import YourModel
class YourAdmin(admin.ModelAdmin):
pass
admin.site.register(YourModel, YourAdmin)
Run Code Online (Sandbox Code Playgroud)
现在您可以添加不同的行为.例如,您可以添加编辑/添加页面中显示的字段列表:
class YourAdmin(admin.ModelAdmin):
fields = ['field1', 'field2']
Run Code Online (Sandbox Code Playgroud)
这可以是模型字段,模型属性或模型方法的名称.方法以只读方式显示.
如果你想让一个字段只读,请明确添加:
class YourAdmin(admin.ModelAdmin):
fields = ['field1', 'field2']
readonly_fields = ['field2']
Run Code Online (Sandbox Code Playgroud)
然后,您可以选择通过添加具有相同名称的方法来完全覆盖字段的显示.您甚至不需要具有该名称的模型字段/方法,然后:
class YourAdmin(admin.ModelAdmin):
fields = ['field1', 'field2']
readonly_fields = ['field2']
def field2(self, obj):
return '*** CLASSIFIED *** {}'.format(obj.field2)
Run Code Online (Sandbox Code Playgroud)
有了django.utils.safestring.mark_safe你可以返回HTML代码.
管理员的所有其他选项均可用,但窗口小部件配置除外,因为它仅适用于可写字段.
我可能对你想要什么有点困惑,但你可能想研究一下模型属性。这是我当前项目的一个例子。
模型内的代码:
class Textbook(models.Model):
#other fields
@property
def NumWishes(self):
return self.wishlist_set.count()
Run Code Online (Sandbox Code Playgroud)
然后你就可以在管理页面上显示它。
class Textbook_table(admin.ModelAdmin):
fields = ["""attributes that are saved in the model"""]
list_display = ("""attributes that are saved in the model""", 'NumWishes'')
Run Code Online (Sandbox Code Playgroud)
现在我可以在管理页面中显示 NumWishes,但不需要使用模型创建它。
| 归档时间: |
|
| 查看次数: |
8850 次 |
| 最近记录: |