只读表单字段格式
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项目应用-只读字段与后端表单验证