gpt4 book ai didi

python - 变量作为字段选项中的参数

转载 作者:太空宇宙 更新时间:2023-11-03 23:51:08 26 4
gpt4 key购买 nike

我想创建一个模型,在创建时设置 editable=False,在编辑项目时设置 editable=True。我认为它应该是这样的:

 home = models.ForeignKey(Team, editable=lambda self: True if self.id else False)

但它不起作用。也许覆盖 init 的东西可以帮助我,但我不确定什么可以做到这一点。我知道我可以在 save() 方法中检查 self.id,但为时已晚,我希望在我填写字段时在管理应用程序中使用这种逻辑。

最佳答案

将以下内容(this code 的一个小扩展)添加到您的 admin.py:

from django import forms

class ReadOnlyWidget(forms.Widget):
def __init__(self, original_value, display_value):
self.original_value = original_value
self.display_value = display_value

super(ReadOnlyWidget, self).__init__()

def render(self, name, value, attrs=None):
if self.display_value is not None:
return unicode(self.display_value)
return unicode(self.original_value)

def value_from_datadict(self, data, files, name):
return self.original_value

class ReadOnlyAdminFields(object):
def get_form(self, request, obj=None):
form = super(ReadOnlyAdminFields, self).get_form(request, obj)
fields = getattr(self, 'readonly', [])
if obj is not None:
fields += getattr(self, 'readonly_on_edit', [])

for field_name in fields:
if field_name in form.base_fields:
if hasattr(obj, 'get_%s_display' % field_name):
display_value = getattr(obj, 'get_%s_display' % field_name)()
else:
display_value = None

form.base_fields[field_name].widget = ReadOnlyWidget(getattr(obj, field_name, ''), display_value)
form.base_fields[field_name].required = False

return form

然后您可以指定某些字段在编辑对象时应为只读:

class PersonAdmin(ReadOnlyAdminFields, admin.ModelAdmin):
readonly_on_edit = ('home',)

admin.site.register(Person, PersonAdmin)

关于python - 变量作为字段选项中的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/206245/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com