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

标签 python django

我想创建一个模型,在创建时设置 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/

相关文章:

python - 无法将 Spark 添加到 PYTHONPATH

python - 我的循环内部出了什么问题?

python - Django 模板中的动态列数

python - Django - 用户只能投票一次

python - django.utils.encoding.DjangoUnicodeDecodeError

python - 如何在图表上指示线的起点?

python - 获取仅以空格开头的数据正则表达式 - Python

django - Celery + Redis - Django 在延迟触发任务时阻塞

django - 不可散列类型 : 'list' error when trying to add m2m relationships dynamically using post_save in Django

python - 无法将 BigQuery 数据导入 GCP AI Notebook