【问题标题】:Read-only form field formatting只读表单字段格式
【发布时间】:2011-12-18 02:26:17
【问题描述】:

我想在ModelAdmin 表单中将字段显示为只读,所以我将它添加到readonly_fields 属性中。

但是,由于该字段包含一种货币,存储为整数,因此我想对其应用一些漂亮的格式。我为我的ModelAdmin 创建了一个自定义ModelForm,尝试在覆盖的__init__ 方法中应用格式。

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

有人知道readonly_fields 的值保存在哪里,还是有更好/不同的方法?

【问题讨论】:

    标签: django forms admin


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      只需执行以下操作:

      class MyAdmin(admin.ModelAdmin):
          readonly_fields = ('foo',)
      
          def foo(self, obj):
              return '${0}'.format(obj.amount)
      

      【讨论】:

      • 刚开始的时候我以为我尝试了类似的方法,但我可能搞砸了一些东西,然后从那里开始寻找越来越复杂的解决方案。无论如何,正是我需要的。谢谢。
      【解决方案3】:

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

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

      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']
      

      【讨论】:

        猜你喜欢
        • 2018-04-28
        • 1970-01-01
        • 2012-10-20
        • 2017-05-07
        • 1970-01-01
        • 2012-02-01
        • 2015-08-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多