如何在Admin之外使用“Readonly Field”

时间:2015-03-27 06:06:34

标签: python django django-forms django-admin

我有一个表单,我需要在管理区域之外显示我的项目,某些字段无法编辑但可以看到它们。

要做到这一点会很棒" AdminReadonlyField "发现在" django.contrib.admin.helpers" 问题在于你无法做到。

enter image description here

我试图创建一些可以替换这个复杂类的小部件,但我无法使它与DateTiemField字段一起正常工作。

class UserUpdateForm(forms.ModelForm):
    """
    We need field "date_joined" can not be edited but can see them
    """
    class Meta:
        model = User
        fields = ('first_name', 'last_name',
                 'email', 'date_joined', 'slug')

    def __init__(self, user, *args, **kwargs):
        kwargs['instance'] = user
        super(UserUpdateForm, self).__init__(*args, **kwargs)
        self.fields['date_joined'].widget = widgets.CMDateTimeText()

    def clean_date_joined(self):
        instance = getattr(self, 'instance', None)
        if instance and instance.pk:
            return instance.date_joined
        else:
            return self.cleaned_data['date_joined']

我的代码,有些不对劲。

class CMDateTimeText(DateTimeBaseInput):
    """
    A SplitDateTime Widget that has some admin-specific styling.
    Hereda Field and Widget.
    """
    format_key = 'DATETIME_FORMAT'
    def __init__(self, attrs=None, format=None):
        # Use slightly better defaults than HTML's 20x2 box
        default_attrs = {'class': 'date_id'}
        if attrs:
            default_attrs.update(attrs)
        super(CMDateTimeText, self).__init__(attrs=default_attrs, format=format)

    def render(self, name, value, attrs=None):
        if value is None:
            value = ''
        value = self._format_value(value)
        final_attrs = self.build_attrs(attrs, name=name)
        return format_html('<p{}>{}</p>', flatatt(final_attrs), conditional_escape(value))

结果图片: enter image description here

任何想法怎么做&#34; AdminReadonlyField&#34;&#34;任何观点或形式?

1 个答案:

答案 0 :(得分:1)

因此,经过几个小时的寻找各种解决方案后,我发现了如何以Django方式实现这一目标。

只需将属性disabled添加到表单中的字段(而不是小部件!):

# in __init__() with crispy-forms for instance
self.fields['field'].disabled = True 

# as form field
field = forms.CharField(disabled=True) 

并且它有效...... Django正在照顾不保存该字段,如果一些黑客篡改了它,尽管它被禁用了。仅适用于Django 1.9 +。