只读表单字段格式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了只读表单字段格式相关的知识,希望对你有一定的参考价值。

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

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

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

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

答案

做一些像:

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

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

适用于所有类型表单的替代方法是创建表示只读字段的窗口小部件。这是我为自己编写的一个。您可以更改<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类做一些样式,或者你可以相应地调整属性。

另一答案

另一个更合适的解决方案适用于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']

以上是关于只读表单字段格式的主要内容,如果未能解决你的问题,请参考以下文章

Python入门自学进阶-Web框架——28DjangoAdmin项目应用-只读字段与后端表单验证

Python入门自学进阶-Web框架——28DjangoAdmin项目应用-只读字段与后端表单验证

如何防止我的表单的只读字段数据?

Django:未提交表单中的只读字段

为啥 Django 中的只读表单字段是个坏主意?

为啥 Django 中的只读表单字段是个坏主意?