只读表单字段格式

问题描述 投票:1回答:3

我想以ModelAdmin形式将字段显示为只读,因此我将其添加到readonly_fields属性中。

但是,由于该字段包含存储为整数的货币,我想应用一些不错的格式。我为我的ModelForm创建了一个自定义ModelAdmin,试图在重写的__init__方法中应用格式。

问题是,我找不到价值。该字段不存在于self.fields属性中。

有谁知道保持readonly_fields的价值在哪里,或者有更好/不同的方法?

django forms admin
3个回答
2
投票

做一些像:

class MyAdmin(admin.ModelAdmin):
    readonly_fields = ('foo',)

    def foo(self, obj):
        return '${0}'.format(obj.amount)

3
投票

适用于所有类型表单的替代方法是创建表示只读字段的窗口小部件。这是我为自己编写的一个。您可以更改<span %s>%s</span>以满足您自己的要求。

from django import forms
from django.utils.safestring import mark_safe
from django.utils.encoding import force_unicode


class ReadOnlyWidget(forms.TextInput):
    def render(self, name, value, attrs=None):
         if value is None:
             value = ''
         final_attrs = self.build_attrs(attrs, type=self.input_type, name=name)
         if value != '':
             # Only add the 'value' attribute if a value is non-empty.
             final_attrs['value'] = force_unicode(self._format_value(value))
         return mark_safe(u'<span%s />%s</span>' % (flatatt(final_attrs),value))

添加完成后,只需执行以下操作:

class MyAdmin(admin.ModelAdmin):
    foo = models.TextField(widget=ReadOnlyWidget(attrs={'class':'read-only'}
                           initial="$50")

然后在你的CSS中,为read-only类做一些样式,或者你可以相应地调整属性。


1
投票

另一个更合适的解决方案适用于Django 2.1.2:

如果我们查看contents方法,ModelAdmin通过特殊包装器AdminReadonlyField(django / contrib / admin / helpers.py)呈现只读字段,我们可以看到代码

if getattr(widget, 'read_only', False):
    return widget.render(field, value)

这意味着如果窗口小部件具有read_only属性的True属性,那么只读字段将调用窗口小部件的渲染方法。因此,您可以使用render方法格式化您的值。

例如:

class CustomDateInput(widgets.DateInput):
    read_only = True

    def _render(self, template_name, context, renderer=None):
        return 'you value'

class CustomForm(forms.ModelForm):
    some_field = forms.DateTimeField(widget=CustomDateInput())

@admin.register(SomeModel)
class SomeModelAdmin(admin.ModelAdmin):
    form = CustomForm    
    readonly_fields = ['some_field']
© www.soinside.com 2019 - 2024. All rights reserved.